3 回答
TA貢獻1744條經驗 獲得超4個贊
確保子進程被殺死的唯一方法,是在同一個進程組中啟動它,并將進程組作為一個整體殺死,或者Pdeadthsig在syscall.SetProcAddr.
您可以為SIG_INTand等常見信號設置信號處理程序SIG_TERM,并在退出之前終止您的子進程,但由于您無法捕獲SIG_KILL,因此通常不值得付出努力。
請參閱:其他 goroutine 中的恐慌沒有停止子進程
cmd := exec.Command("./long-process")
cmd.SysProcAttr = &syscall.SysProcAttr{
Pdeathsig: syscall.SIGTERM,
}
TA貢獻1898條經驗 獲得超8個贊
一種可能的策略是將正在運行的進程列表保存在全局數組中,var childProcesses = make([]*os.Process, 0)并在每次啟動進程時附加到該列表中。
有自己的Exit功能。確保您永遠不會os.Exit在代碼中的任何地方調用,Exit而是始終調用您自己的函數。您的退出功能將殺死所有childProcesses
for _, p := range childProcesses {
p.Kill()
}
處理信號,使它們通過您自己的退出函數,例如在初始化期間執行此操作(靠近主函數頂部的某個位置)
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL, syscall.SIGQUIT)
goUnsafe(func() {
var signal = <-sigs
log.Println("Got Signal", signal)
Exit(0)
})
TA貢獻1853條經驗 獲得超6個贊
我在 Go (golang) 中有一些代碼,有幾個不同的線程運行一個單獨的可執行文件。我想確保如果用戶在 Go 中殺死我的進程,我有辦法殺死我調用的可執行文件,有沒有辦法做到這一點?
我不清楚您所說的“運行不同的線程”是什么意思。我會假設:
這些線程屬于“我調用的可執行文件”
那些線程不一定是用 golang 寫的
您無法控制它們的執行(即,您無法更改它們的代碼)
從這個意義上說,我們正在談論創建一個進程組并確保當您殺死一個進程時,該組中的所有其他進程也必須停止。此機制依賴于操作系統。
在當前版本中,有兩種可能性(參見包x/sys):
Unix:即將
setpgid(2)視窗:快到了
CreateProcess。請參閱MS Windows 文檔 CreateProcess。你必須通過CREATE_NEW_PROCESS_GROUP旗幟(見)
- 3 回答
- 0 關注
- 248 瀏覽
添加回答
舉報
