问题:我应该如何在后台运行我的 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