6

我在 Go 中制作了一个程序来杀死一个进程syscall.Kill()

fork()但是,如果我用+对该进程进行 daeminze,setsid()syscall.Kill()不会终止该进程。

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

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

4

1 回答 1

6

使用系统调用守护一个 Go 进程目前不可能可靠地完成,这就是为什么你的那种守护进程不可能被杀死:它已经被楔入(尽管我应该承认它没有响应发送而死的原因很奇怪,SIGKILL这使得内核只是破坏进程,不尝试信号传递)。

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

于 2014-04-12T19:17:10.450 回答