猿问

通过golang程序启动杀进程

我有一个守护进程正在运行,它启动了另一个进程。为了现在模拟它,我刚刚设置了“睡眠”。如果我终止进程,它仍然是僵尸。如何正确清洁它。


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 sleep


37342 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(睡觉)


HUH函数
浏览 199回答 1
1回答

皈依舞

你需要cmd.Wait()让它完成。(在一般的 Unix 中,您需要等待(2) 以避免泄漏僵尸。)"os/exec"没有这个的非阻塞变体(没有等同于waitpid (2) 的变体)但是你可以在 goroutine 中等待:// Start the subprocesscmd := exec.Command("sleep", "500")err := cmd.Start()if err != nil {        log.Fatal(err)}// Wait for it to finishdone := make(chan struct{})go (func () {        cmd.Wait()        close(done)})()// Set a timeouttimeout := 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()应该立即返回,这应该向“完成”通道发出信号。
随时随地看视频慕课网APP

相关分类

Go
我要回答