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

AhmetB-Google

看起来如果您通过exec.CmdStart()创建一个子流程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.Pid字段紧接在I之后cmd.Start(),但是看起来像os.Process没有公开任何机制来检查进程是否在运行。

os.FindProcess说:

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

这没有用–似乎没有办法从os.Process转到os.ProcessState,除非您.Wait()破坏了整个目的(我想知道该进程是否在退出之前在运行)。

星期二

我认为您在这里有两个合理的选择:

  • 衍生出一个goroutine,等待进程退出。等待完成后,您知道该过程已退出。(正面:很容易正确编码;负面:将OS线程专用于等待。)

  • 使用syscall.Wait4()于已出版PidWait4具有syscall.WNOHANGset的A立即返回,填写状态。

如果有一个导出oscmd函数Wait4为您完成并填充了ProcessState,那可能会很好WNOHANG认为合适,可以提供或不提供但是没有。


的要点ProcessState.Exited()是区分所有各种可能性,包括:

  • 进程正常退出(带有状态字节)
  • 进程由于接收到未处理的信号而死亡

请参见ProcessState的纵梁请注意,还有比这两个更多的可能性......只是似乎有没有办法让别人进一个ProcessStatesyscall.Wait似乎唯一的电话是:

  • syscall/exec_unix.go:失败后exec,在返回错误之前收集僵尸;
  • os/exec_unix.go:致电后p.blockUntilWaitable()

如果不是的blockUntilWaitable,则exec_unix.go执行变异wait()可致电syscall.Wait4syscall.WNOHANG,但blockUntilWaitable本身保证,这是没有意义的(这特别的目的wait是等待退出反正)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章