【发布时间】:2017-09-22 15:03:26
【问题描述】:
我的 golang 程序启动了一个应该永远运行的服务程序,如下所示:
cmd := exec.Command("/path/to/service")
cmd.Start()
我不想等待“服务”的终止,因为它应该永远运行。但是,如果服务启动时出现错误(例如,如果另一个实例已经在运行,它将终止),子进程将退出并成为僵尸。
我的问题是,在 cmd.Start() 之后,我能否以某种方式检测子进程是否仍在运行,而不是变成僵尸?首选方式可能是:
if cmd.Process.IsZombie() {
... ...
}
或者,
procStat := cmd.GetProcessStatus()
if procStat.Zombie == true {
... ...
}
即我希望有一些方法可以在不等待其退出代码的情况下获取(子)进程的状态,或者在不阻塞的情况下“查看”其状态代码。
谢谢!
【问题讨论】:
-
这就是unix进程的工作方式,你总是需要
wait他们。init进程 (PID 1) 会在父进程退出时为您执行此操作,但您应该清理自己的进程。 -
另一种选择,从这里的答案:stackoverflow.com/questions/36050503/… 似乎如果父进程忽略 SIGCHLD,那么子进程如果退出就不会变成僵尸?如果这是正确的,那么我可能只是使用 FindProcess 来查看子进程是否仍然存在?