登录
首页 >  Golang >  Go问答

无法中止 Go 代码启动的进程

来源:stackoverflow

时间:2024-03-09 09:39:29 408浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《无法中止 Go 代码启动的进程》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我正在尝试编写一个 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% 杀死这些进程


解决方案


如果您阅读了 func (*process) killdoc

func (p *Process) Kill() error

因此,您的情况可能是它不会杀死它可能已启动的任何其他进程。

此外,这可能会有所帮助Terminating processes in go

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《无法中止 Go 代码启动的进程》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>