gpt4 book ai didi

go - 无法终止我开始使用Go代码的进程

转载 作者:行者123 更新时间:2023-12-01 22:23:57 24 4
gpt4 key购买 nike

我正在尝试编写一个go包,该包可以运行一堆进程并停止/重新启动它们。是停止/重新启动部分导致某种应用程序出现问题。

我使用https://godoc.org/os/exec库启动进程。假设我启动了两个进程firefox,而另一个进程可以curl blog.golang.org继续运行。

这就是我启动流程以及停止流程的方式

func newWorker(proc *Process) *worker {
cmd := exec.Command(proc.Executable, proc.Args...)
cmd.Env = proc.Env
return &worker{
status: "ready",
command: cmd,
}
}

func (w *worker) start(crashed chan *worker, completed chan struct{}) {
w.status = "running"
err := w.command.Start()
if err != nil {
fmt.Println(err)
// signal a crash
w.status = "crashed"
crashed <- w
return
}
fmt.Println("ran ", w.command.Path, w.command.Process.Pid)
completed <- struct{}{}
}

func (w *worker) stop(crashed chan *worker, completed chan struct{}) {
w.status = "stopped"
err := w.command.Process.Kill()
if err != nil {
fmt.Println("couldn't kill process ", w.command.Path)
}
completed <- struct{}{}
}

当我运行我的应用程序以启动这些过程时,它会同时启动curl命令和firefox,但是当我尝试调用stop方法时,它将杀死进程而没有任何错误,但是我仍然看到firefox窗口处于打开状态,因此我不确定该过程是否已经退出。我尝试用 KillSignal(os.Kill)杀死进程都具有相同的结果。

我还尝试通过使用 Run而不是 Start来更改创建进程的方式,但是在这种情况下,调用stop方法时出现了这些错误
os: process already finished  couldn't kill process  /usr/bin/curl
exit status 0 KILLING /usr/bin/curl
os: process already finished couldn't kill process /usr/bin/firefox

并且firefox窗口仍然打开,我还尝试为我正在运行的每个命令打印出 ProcessState字段,但结果是 nil
我不确定该怎么做,我想确保我的代码100%杀死了这些进程

最佳答案

如果您阅读doc以获得func (*Process) Kill

func (p *Process) Kill() error

杀死会导致进程立即退出。杀不等到
该过程实际上已经退出。这只会杀死进程本身,
可能没有启动任何其他进程。

因此,这可能是您的情况,它不会终止可能已经启动的任何其他进程。

另外,这可能对也有帮助: Terminating processes in go

关于go - 无法终止我开始使用Go代码的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61170898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com