看起来,如果您通过exec.Cmd和Start()创建了一个子流程,则会立即填充Cmd.Process
字段,但是Cmd.ProcessState
字段将保持nil
直到该流程退出。
如此看来,我在运行时仍无法实际检查Start()
编码的进程的状态?
对我来说,在进程退出时设置ProcessState
毫无意义。在这种情况下,有一个ProcessState.Exited()方法将始终返回true
。
因此,我尝试采用这种方法:cmd.Process.Pid
字段在cmd.Start()
之后立即存在,但是os.Process似乎没有提供任何机制来检查进程是否在运行。
os.FindProcess说:
这没有用–似乎没有办法从os.Process转换为os.ProcessState,除非您使用.Wait()
破坏了整个目的(我想知道该过程是否正在运行,然后退出)。
最佳答案
我认为您在这里有两个合理的选择:
syscall.Wait4()
上使用Pid
。设置了Wait4
的syscall.WNOHANG
会立即返回,并填写状态。 如果有一个导出的
os
或cmd
函数为您完成了Wait4
并填写了ProcessState,那可能会很好。您认为合适,可以提供WNOHANG
,也可以不提供。但是没有。ProcessState.Exited()
的重点是区分所有各种可能性,包括:参见the stringer for ProcessState。请注意,比这两种方法有更多的可能性……仅似乎无法将其他方法变成
ProcessState
。对syscall.Wait
的唯一调用似乎是:syscall/exec_unix.go
:失败的exec
之后,在返回错误之前收集僵尸;和os/exec_unix.go
:调用p.blockUntilWaitable()
之后。 如果不是
blockUntilWaitable
,则exec_unix.go
的wait()
实现变体可以使用syscall.Wait4
调用syscall.WNOHANG
,但blockUntilWaitable
本身可确保这毫无意义(并且此wait
的目标是无论如何都要等待退出)。