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