我在 Go 中制作了用 syscall.Kill()
杀死进程的程序
但是,如果我用fork()
&setsid()
来守护这个过程,那么syscall.Kill()
不会杀死这个过程。
如果我使用 shell kill
那么我可以在这两种情况下杀死该过程。
我尝试了不同的信号:SIGINT
、SIGTERM
和SIGKILL
buthey不会杀死守护进程。
使用系统调用守护 Go 进程目前不可能可靠地完成,这就是为什么你的守护进程不可能被杀死的原因:它已经被楔入了(尽管我应该承认这很奇怪,为什么它没有响应发送SIGKILL
而死亡,这使得内核只是破坏进程,没有尝试信号传递(。
为了正确地守护一个 Go 进程,建议使用包装进程(如 daemon
(或在init
超级服务器(如 systemd
或 upstart
(的高级替代品或独立的主管(如 runit
、monit
等(下运行它——在这种情况下,该进程没有成为真正的 Unix 守护进程的脑死亡要求,并且可能表现得像一个普通进程: 不执行双重fork
和加setsid
欺骗,不弄乱PID文件管理,能够写入其常规I/O流等。