为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕婉清6462132 2023-07-10 14:47:11
看起来如果您通过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. A Wait4with syscall.WNOHANGset 立即返回,填写状态。

如果有一个导出的函数oscmd函数可以为您执行此操作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是无论如何都要等待退出)。


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信