3 回答

TA貢獻1744條經(jīng)驗 獲得超4個贊
確保子進程被殺死的唯一方法,是在同一個進程組中啟動它,并將進程組作為一個整體殺死,或者Pdeadthsig在syscall.SetProcAddr.
您可以為SIG_INTand等常見信號設(shè)置信號處理程序SIG_TERM,并在退出之前終止您的子進程,但由于您無法捕獲SIG_KILL,因此通常不值得付出努力。
請參閱:其他 goroutine 中的恐慌沒有停止子進程
cmd := exec.Command("./long-process")
cmd.SysProcAttr = &syscall.SysProcAttr{
Pdeathsig: syscall.SIGTERM,
}

TA貢獻1898條經(jīng)驗 獲得超8個贊
一種可能的策略是將正在運行的進程列表保存在全局數(shù)組中,var childProcesses = make([]*os.Process, 0)并在每次啟動進程時附加到該列表中。
有自己的Exit功能。確保您永遠不會os.Exit在代碼中的任何地方調(diào)用,Exit而是始終調(diào)用您自己的函數(shù)。您的退出功能將殺死所有childProcesses
for _, p := range childProcesses {
p.Kill()
}
處理信號,使它們通過您自己的退出函數(shù),例如在初始化期間執(zhí)行此操作(靠近主函數(shù)頂部的某個位置)
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條經(jīng)驗 獲得超6個贊
我在 Go (golang) 中有一些代碼,有幾個不同的線程運行一個單獨的可執(zhí)行文件。我想確保如果用戶在 Go 中殺死我的進程,我有辦法殺死我調(diào)用的可執(zhí)行文件,有沒有辦法做到這一點?
我不清楚您所說的“運行不同的線程”是什么意思。我會假設(shè):
這些線程屬于“我調(diào)用的可執(zhí)行文件”
那些線程不一定是用 golang 寫的
您無法控制它們的執(zhí)行(即,您無法更改它們的代碼)
從這個意義上說,我們正在談?wù)搫?chuàng)建一個進程組并確保當您殺死一個進程時,該組中的所有其他進程也必須停止。此機制依賴于操作系統(tǒng)。
在當前版本中,有兩種可能性(參見包x/sys):
Unix:即將
setpgid(2)
視窗:快到了
CreateProcess
。請參閱MS Windows 文檔 CreateProcess。你必須通過CREATE_NEW_PROCESS_GROUP
旗幟(見)
- 3 回答
- 0 關(guān)注
- 227 瀏覽
添加回答
舉報