一尘不染

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

go

这个问题与编程没有严格关系,但是对于程序员来说肯定是重要的。

我写了一个简单的smtp服务器,当我从控制台运行它时,一切都很好,只是它阻止了命令行。

我知道我可以通过运行它

nohup ... &

或通过屏幕/ tmux等

但是问题是,我应该如何实现我的程序在后台运行,并且系统管理员可以很高兴地设置和管理该程序?

有些人比我有更多的经验,在golang-
nuts上
写道,他们不使用fork等,而是使用monit等形式的“包装器”。

目标平台基于Debian,包装盒上的所有其他内容均基于init.d。

关于该主题的任何良好资源,或编写良好的示例项目的资源?


阅读 801

收藏
2020-07-02

共1个答案

一尘不染

正如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

2020-07-02