os.FindProcess(pid)之后的os.Process.Wait()适用于不在linux上的窗口

时间:2016-06-06 18:02:37

标签: linux windows 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 个答案:

答案 0 :(得分:4)

您没有处理来自Wait的错误消息。尝试:

ps, err := proc.Cmd.Wait()
if err != nil {
    /* handle it */
}

同样the documentation说:

  

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

在您恢复的情况下,您的流程不是您使用os.FindProcess找到的流程的父级。

那为什么它适用于Windows?我怀疑这是因为on windows归结为WaitForSingleObject而没有这个要求。