- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个正在运行的守护进程,它启动了另一个进程。为了现在模拟它,我刚刚设置了“ 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/
我试图理解什么是 -XX:OnOutOfMemoryError='kill %p' 下面的命令是什么意思? 我不确定 %p 是什么意思? exec /bin/bash -c "LD_LIBRARY_P
我试图理解什么是 -XX:OnOutOfMemoryError='kill %p' 下面的命令是什么意思? 我不确定 %p 是什么意思? exec /bin/bash -c "LD_LIBRARY_P
这个问题在这里已经有了答案: Solving "adb server version doesn't match this client" error [duplicate] (17 个答案) 关闭
我是一名优秀的程序员,十分优秀!