尝试在 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没有该要求。
- 1 回答
- 0 关注
- 587 浏览
添加回答
举报
0/150
提交
取消