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

尝试在 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()相同的问题


眼眸繁星
浏览 588回答 1
1回答

江户川乱折腾

您没有从Wait. 尝试:ps, err := proc.Cmd.Wait()if err != nil {&nbsp; &nbsp; /* handle it */}文档还说:Wait 等待进程退出,然后返回描述其状态和错误(如果有)的 ProcessState。等待释放与进程关联的任何资源。在大多数操作系统上,进程必须是当前进程的子进程,否则将返回错误。在您的情况下,由于您正在“恢复”,因此您的进程不是您使用os.FindProcess.那么为什么它可以在 Windows 上运行呢?我怀疑这是因为在 Windows上归结为WaitForSingleObject没有该要求。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go