无法使用`syscall.Kill()`一个守护进程的Go进程

时间:2014-04-11 16:33:01

标签: go signals daemon sigkill

我在Go中创建了使用syscall.Kill()

杀死进程的程序

但是,如果我使用fork() + setsid()将该流程告终,那么syscall.Kill()就不会杀死该流程。

如果我使用shell kill,那么在这两种情况下我都可以杀死该进程。

我尝试了不同的信号:SIGINTSIGTERMSIGKILL但是他们不会杀死守护进程。

1 个答案:

答案 0 :(得分:6)

使用系统调用is not currently possible to do reliably对一个Go进程进行守护进程,这就是为什么你的守护进程不可能被杀死的原因:它已被楔入(虽然我应该承认它很奇怪为什么它没有死于响应发送SIGKILL,这使得内核只是破坏了进程,没有尝试信号传递。

为了正确地守护Go过程,建议使用包装器过程(例如daemon)或在init超级服务器(例如systemd)的高级替代品下运行它。 upstart或独立的主管,例如runitmonit和其他人 - 在这种情况下,该进程没有脑卒中要求成为真正的Unix守护程序,并且可能表现得像一个正常的进程:不执行double - fork + setsid欺骗,不会乱用PID文件管理,能够写入常规I / O流等。