看起来如果您通过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.ProcessStateStart()所以看起来我实际上无法检查我编辑的进程仍在运行时的状态?ProcessState当进程退出时,设置对我来说毫无意义。在这种情况下,有一个ProcessState.Exited()方法将始终返回true。所以我尝试走这条路线:cmd.Process.Pidfield 在 I 之后就存在cmd.Start(),但是看起来os.Process没有公开任何机制来检查进程是否正在运行。os.FindProcess说:在 Unix 系统上,FindProcess 始终成功并返回给定 pid 的进程,无论该进程是否存在。这是没有用的——而且似乎没有办法从os.Process转到os.ProcessState除非你.Wait()违背了整个目的(我想知道进程在退出之前是否正在运行)。
1 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
我认为你在这里有两个合理的选择:
分离一个等待进程退出的 goroutine。等待完成后,您就知道进程已退出。(正面:很容易正确编码;负面:你专门有一个操作系统线程来等待。)
syscall.Wait4()
在已发布的Pid
. AWait4
withsyscall.WNOHANG
set 立即返回,填写状态。
如果有一个导出的函数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.Wait4
with syscall.WNOHANG
,但blockUntilWaitable
它本身确保这是毫无意义的(并且这个特定的目标wait
是无论如何都要等待退出)。
- 1 回答
- 0 关注
- 103 浏览
添加回答
举报
0/150
提交
取消