尝试恢复进程时遇到问题。我的应用程序启动了一堆进程,当它崩溃时,进程就在外面,当我重新运行我的应用程序时,我想要恢复我的进程。在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()
答案 0 :(得分:4)
您没有处理来自Wait
的错误消息。尝试:
ps, err := proc.Cmd.Wait()
if err != nil {
/* handle it */
}
Wait等待Process退出,然后返回ProcessState 描述其状态和错误,如果有的话。等待释放任何 与流程相关的资源。 在大多数操作系统上, 进程必须是当前进程的子进程或错误 返回强>
在您恢复的情况下,您的流程不是您使用os.FindProcess
找到的流程的父级。
那为什么它适用于Windows?我怀疑这是因为on windows归结为WaitForSingleObject
而没有这个要求。