亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過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 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號