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

Eug*_*ene 6 signals daemon go sigkill

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

但是,如果我使用fork()+ 继续该过程,setsid()syscall.Kill()不会杀死该过程.

如果我使用shell,kill那么在这两种情况下我都能够杀死那个进程.

我尝试了不同的信号:SIGINT,SIGTERMSIGKILLbuthey不杀守护进程.

kos*_*tix 6

使用系统调用守护进程当前不可能可靠地执行,这就是为什么你的守护进程不可能被杀死的原因:它已被楔入(虽然我应该承认,为什么它没有因为发送而死SIGKILL而变得很奇怪内核只是破坏了进程,没有尝试信号传递).

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