为了账号安全,请及时绑定邮箱和手机立即绑定

通过golang程序启动杀进程

通过golang程序启动杀进程

Go
HUH函数 2023-06-01 17:52:38
我有一个守护进程正在运行,它启动了另一个进程。为了现在模拟它,我刚刚设置了“睡眠”。如果我终止进程,它仍然是僵尸。如何正确清洁它。cmd := exec.Command("sleep", "500")err := cmd.Start()if err != nil {    log.Fatal(err)}if err := cmd.Process.Kill(); err != nil {    log.Fatal("failed to kill process: ", err)}time.Sleep(10000000 * time.Millisecond)$ ps aux | grep sleep37342 0.0 0.0 4276984 1040 s000 S+ 下午 5:09 0:00.00 grep 睡眠37309 0.0 0.0 0 0 ?? Z 下午 5:09 0:00.00(睡觉)
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

你需要cmd.Wait()让它完成。(在一般的 Unix 中,您需要等待(2) 以避免泄漏僵尸。)

"os/exec"没有这个的非阻塞变体(没有等同于waitpid (2) 的变体)但是你可以在 goroutine 中等待:

// Start the subprocess

cmd := exec.Command("sleep", "500")

err := cmd.Start()

if err != nil {

        log.Fatal(err)

}


// Wait for it to finish

done := make(chan struct{})

go (func () {

        cmd.Wait()

        close(done)

})()


// Set a timeout

timeout := time.NewTimer(5 * time.Second)


select {

case <-done:

        fmt.Println("process completed")

        if !timeout.Stop() {

                <-timeout.C

        }

case <-timeout.C:

        fmt.Println("deadline ran out, killing process")

        if err := cmd.Process.Kill(); err != nil {

                log.Fatal("failed to kill process: ", err)

        }

        <-done

}

只有意志的一个分支select会触发,并且每个分支都会为另一个执行必要的清理工作。在超时情况下,进程被杀死后,Wait()应该立即返回,这应该向“完成”通道发出信号。


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信