gpt4 book ai didi

go - 通过golang程序启动杀进程

转载 作者:数据小太阳 更新时间:2023-10-29 03:31:25 27 4
gpt4 key购买 nike

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

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 辅助 | grep sleep

37342 0.0 0.0 4276984 1040 s000 S+ 5:09PM 0:00.00 grep sleep

37309 0.0 0.0 0 0 ?? Z 下午 5:09 0:00.00( sleep )

最佳答案

您需要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() 应该立即返回,这应该向“完成” channel 发出信号。

关于go - 通过golang程序启动杀进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54289371/

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