在尝试恢复stream程时遇到问题。 我去应用程序启动一堆进程,当它崩溃的过程是在那里打开,当我重新运行我的应用程序,我想恢复我的进程。 在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()
与同样的问题
您没有处理来自Wait
的错误消息。 尝试:
ps, err := proc.Cmd.Wait() if err != nil { /* handle it */ }
另外文件说:
等待进程退出,然后返回描述其状态和错误(如果有的话)的ProcessState。 等待释放与进程相关的任何资源。 在大多数操作系统上,进程必须是当前进程的子进程,否则将返回错误 。
在你的情况,因为你正在“恢复”,你的进程不是你使用os.FindProcess
发现的进程的父。
那么为什么它在Windows上工作? 我怀疑这是因为在Windows上它归结为WaitForSingleObject
没有这个要求。