我应该如何在后台运行Golang进程?

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 forkexpect daemon需要添加.使用upstart,如果进程不分叉则更好.


Dus*_*tin 10

我不久前写了一篇关于这篇文章的博文.守护进程的想法对我来说似乎不对,因为它会让你担心很多其他事情(例如,当它失败时会发生什么?你如何管理进程重启?你如何处理日志,工作目录,核心,系统重启等...)

事实证明,如果你不努力做到这一切,事情变得容易多了.


Nic*_*ood 5

根据我的经验,Supervisord非常适合这一点.

你编写你的应用程序在命令行上运行,打印东西等,supervisord负责所有的守护,重新启动,如果它出错,速率限制等,等等

我相信以传统的unix方式将程序转移到后台是很困难的,因为运行时在运行main()例程之前启动了一些线程