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