ast*_*nic 15 linux design-patterns process go
这个问题并不是严格的编程相关,但对程序员来说肯定很重要.
我写了一个简单的smtp服务器,当我从控制台运行它一切都很好,除了它阻止命令行.
我知道我可以通过它来运行它
nohup ... &
Run Code Online (Sandbox Code Playgroud)
或通过screen/tmux等
但问题是,我应该如何实现我在后台运行的程序,系统管理员很乐意设置它并管理流程?
有些人比我更有经验,在golang-nuts上写道,他们不使用fork等,并使用monit等形式的"包装".
目标平台是基于Debian的,盒子上的所有其他东西都是基于init.d的.
该主题的任何好资源或编写良好的示例项目的来源?
voi*_*gic 24
正如Nick所说,Supervisord是一个很好的选择,在我的经验中也很有效.
尼克提到了分叉问题 - 分叉本身工作得很好AFAICT.问题不是分叉,而是放弃特权.由于Go运行时启动goroutine被多路复用的线程池的方式(当GOMAXPROX> 1时),setuid系统调用不是删除权限的可靠方法.
相反,您应该以非特权用户身份运行程序,并使用setcap实用程序为其授予所需的权限.
例如,要允许绑定到低端口号(如80),则需要在可执行文件上运行setcap一次: sudo setcap 'cap_net_bind_service=+ep' /opt/yourGoBinary
您可能需要安装setcap: sudo aptitude install libcap2-bin
sna*_*nap 16
已有很好的答案,但我会添加一些额外的信息.
您无需安装其他软件(如supervisordDebian)来处理后台处理过程.
Debian附带了一个名为的工具start-stop-daemon,它是在init.d脚本中启动守护进程的标准方法.如果程序不自行执行,它还可以将该过程置于后台.看看--background选项.
使用/etc/init.d/skeleton为你的初始化脚本的基础,但改变do_start()功能如下:
start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \
--background --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \
--background --exec $DAEMON -- $DAEMON_ARGS \
|| return 2
Run Code Online (Sandbox Code Playgroud)
我还添加了--make-pidfile为您创建PID文件的选项.
如果您需要以安全的方式切换到其他用户,也可以--chuid选择.
在Ubuntu和RHEL/CentOS/SL 6.X上,最简单的方法是编写upstart作业配置文件.只需exec /usr/sbin/yourprogram输入/etc/init/yourprogram.conf配置文件即可.使用暴发户,无需在后台强制执行该程序.不要使用传统守护进程添加expect fork或expect daemon需要添加.使用upstart,如果进程不分叉则更好.
根据我的经验,Supervisord非常适合这一点.
你编写你的应用程序在命令行上运行,打印东西等,supervisord负责所有的守护,重新启动,如果它出错,速率限制等,等等
我相信以传统的unix方式将程序转移到后台是很困难的,因为运行时在运行main()例程之前启动了一些线程