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

os.FindProcess(pid) 之后的 os.Process.Wait()

os.FindProcess(pid) 之后的 os.Process.Wait()

Go
眼眸繁星 2022-01-17 16:12:35
尝试在 go 中恢复进程时遇到问题。我的 go 应用程序启动了一堆进程,当它崩溃时,这些进程是公开的,当我重新运行我的应用程序时,我想恢复我的进程。在 Windows 上,一切都按预期工作,我可以wait()处理kill()它等等。但在 linux 中,它只是通过我的过程wait()而没有任何错误。这是代码func (proc *process) Recover() {    pr, err := os.FindProcess(proc.Cmd.Process.Pid)    if err != nil {        return    }    log.Info("Recovering " + proc.Name + proc.Service.Version)    Processes.Lock()    Processes.Map[proc.Name] = proc    Processes.Unlock()    proc.Cmd.Process = pr    if proc.Service.Reload > 0 {        proc.End = make(chan bool)        go proc.KillRoutine()    }    proc.Cmd.Wait()    if proc.Status != "killed" {        proc.Status = "finished"    }    proc.Time = time.Now()    channelProcess <- proc    //confirmation that process was killed    if proc.End != nil {        proc.End <- true    }}进程是我自己的结构来处理进程重要的部分是来自包的 cmd"os/exec" 我也尝试直接调用pr.wait()相同的问题
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

您没有从Wait. 尝试:


ps, err := proc.Cmd.Wait()

if err != nil {

    /* handle it */

}

文档还说:


Wait 等待进程退出,然后返回描述其状态和错误(如果有)的 ProcessState。等待释放与进程关联的任何资源。在大多数操作系统上,进程必须是当前进程的子进程,否则将返回错误。


在您的情况下,由于您正在“恢复”,因此您的进程不是您使用os.FindProcess.


那么为什么它可以在 Windows 上运行呢?我怀疑这是因为在 Windows上归结为WaitForSingleObject没有该要求。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 587 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号