无法“系统调用”.Kill()' 一个守护进程



我在 Go 中制作了用 syscall.Kill() 杀死进程的程序

但是,如果我用fork()&setsid()来守护这个过程,那么syscall.Kill()不会杀死这个过程。

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

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

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

为了正确地守护一个 Go 进程,建议使用包装进程(如 daemon (或在init超级服务器(如 systemdupstart(的高级替代品或独立的主管(如 runitmonit 等(下运行它——在这种情况下,该进程没有成为真正的 Unix 守护进程的脑死亡要求,并且可能表现得像一个普通进程: 不执行双重fork和加setsid欺骗,不弄乱PID文件管理,能够写入其常规I/O流等。

相关内容

最新更新