我在Go中创建了使用syscall.Kill()
但是,如果我使用fork()
+ setsid()
将该流程告终,那么syscall.Kill()
就不会杀死该流程。
如果我使用shell kill
,那么在这两种情况下我都可以杀死该进程。
我尝试了不同的信号:SIGINT
,SIGTERM
和SIGKILL
但是他们不会杀死守护进程。
答案 0 :(得分:6)
使用系统调用is not currently possible to do reliably对一个Go进程进行守护进程,这就是为什么你的守护进程不可能被杀死的原因:它已被楔入(虽然我应该承认它很奇怪为什么它没有死于响应发送SIGKILL
,这使得内核只是破坏了进程,没有尝试信号传递。
为了正确地守护Go过程,建议使用包装器过程(例如daemon
)或在init
超级服务器(例如systemd
)的高级替代品下运行它。 upstart
或独立的主管,例如runit
,monit
和其他人 - 在这种情况下,该进程没有脑卒中要求成为真正的Unix守护程序,并且可能表现得像一个正常的进程:不执行double - fork
+ setsid
欺骗,不会乱用PID文件管理,能够写入常规I / O流等。