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

标签 linux design-patterns process go

这个问题与编程无关,但对程序员来说肯定很重要。

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

我知道我可以通过

nohup ... &

或通过 screen/tmux 等

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

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

目标平台是基于 Debian 的,盒子上的所有其他东西都是基于 init.d 的。

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

最佳答案

正如尼克提到的 Supervisord是一个很好的选择,在我的经验中也很有效。

Nick 提到了 fork 本身的问题 AFAICT。问题不是 fork ,而是放弃特权。由于 Go 运行时启动多路复用 goroutine 的线程池的方式(当 GOMAXPROX > 1 时),setuid 系统调用 is not a reliable way to drop permissions .

相反,您应该以非特权用户身份运行程序并使用 setcap实用程序来授予它所需的权限。

例如,要允许绑定(bind)到低端口号(如 80)运行,需要在可执行文件上运行一次 setcap:sudo setcap 'cap_net_bind_service=+ep'/opt/yourGoBinary

您可能需要安装 setcap:sudo aptitude install libcap2-bin

关于linux - 我应该如何在后台运行我的 Golang 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14537045/

相关文章:

c++ - sed/regex - 更新具有范围问题的源文件

linux - 克隆用户,复制所有文件和文件夹以及复制权限(Linux)

c# - 日志记录类应该作为依赖项插入还是应该使用静态方法

ios - 如何在 ios 中运行后台 HTTP 进程?

java 应用程序和 x11 转发

c - 如何在不关闭套接字的情况下向主机发送 FIN 标志

c# - 派生静态成员

java - 这个类是否遵循单一职责原则?

python - 如何在python中检索进程开始时间(或正常运行时间)

python - 启动带有输出和超时的 python 进程