如何检查后台启动的进程是否仍在运行?

看起来如果您通过exec.Cmd和Start()创建一个子进程,该Cmd.Process字段会立即填充,但Cmd.ProcessState字段会保留nil到进程退出为止。

 // ProcessState contains information about an exited process,

   // available after a call to Wait or Run.

   ProcessState *os.ProcessState

Start()所以看起来我实际上无法检查我编辑的进程仍在运行时的状态?

ProcessState当进程退出时,设置对我来说毫无意义。在这种情况下,有一个ProcessState.Exited()方法将始终返回true


所以我尝试走这条路线:cmd.Process.Pidfield 在 I 之后就存在cmd.Start(),但是看起来os.Process没有公开任何机制来检查进程是否正在运行。

os.FindProcess说:

在 Unix 系统上,FindProcess 始终成功并返回给定 pid 的进程,无论该进程是否存在。

这是没有用的——而且似乎没有办法从os.Process转到os.ProcessState除非你.Wait()违背了整个目的(我想知道进程在退出之前是否正在运行)。


慕婉清6462132
浏览 104回答 1
1回答

牛魔王的故事

我认为你在这里有两个合理的选择:分离一个等待进程退出的 goroutine。等待完成后,您就知道进程已退出。(正面:很容易正确编码;负面:你专门有一个操作系统线程来等待。)syscall.Wait4()在已发布的Pid. A Wait4with syscall.WNOHANGset 立即返回,填写状态。如果有一个导出的函数os或cmd函数可以为您执行此操作Wait4并填充 ProcessState,那就太好了。您可以提供WNOHANG也可以不提供,只要您认为合适即可。但没有。要点ProcessState.Exited()是区分所有各种可能性,包括:进程正常退出(带有状态字节)进程因接收到未处理的信号而终止请注意,还有比这两种更多的可能性......只是似乎没有办法让其他人进入ProcessState. 唯一的调用syscall.Wait似乎是:syscall/exec_unix.go:失败后exec,在返回错误之前收集僵尸;和os/exec_unix.go: 拨打电话后p.blockUntilWaitable().如果不是blockUntilWaitable,的exec_unix.go实现变体wait()可以调用syscall.Wait4with syscall.WNOHANG,但blockUntilWaitable它本身确保这是毫无意义的(并且这个特定的目标wait是无论如何都要等待退出)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go