问题:我应该如何在后台运行我的 Golang 进程?
这个问题与编程无关,但对程序员来说肯定很重要。
我写了一个简单的 smtp 服务器,当我从控制台运行它时一切都很好,除了它阻塞了命令行。
我知道我可以通过
nohup ... &
或通过 screen / tmux 等
但问题是,我应该如何实现它在后台运行的程序,并且系统管理员会很高兴设置它并管理该过程?
一些比我更有经验的人,在golang-nuts写道,他们不使用 fork 等,而是使用来自 monit 等形式的一些“包装器”。
目标平台是基于 Debian 的,盒子上的所有其他东西都是基于 init.d 的。
该主题的任何好的资源或编写良好的示例项目的来源?
解答
正如尼克提到的Supervisord是一个很好的选择,在我的经验中也很有效。
Nick 提到了分叉本身的问题,AFAICT 工作得很好。问题不是分叉,而是放弃特权。由于 Go 运行时启动多路复用 goroutine 的线程池的方式(当 GOMAXPROX > 1 时),setuid 系统调用不是删除权限的可靠方法。
相反,您应该以非特权用户身份运行程序并使用setcap实用程序授予它所需的权限。
sudo setcap 'cap_net_bind_service=+ep' /opt/yourGoBinary
sudo aptitude install libcap2-bin