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

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

確保 Go Process 中調用的可執行文件在 Process 被殺死時被殺死

確保 Go Process 中調用的可執行文件在 Process 被殺死時被殺死

Go
瀟湘沐 2021-12-07 10:07:13
我在 Go (golang) 中有一些代碼,有幾個不同的線程運行一個單獨的可執行文件。我想確保如果用戶在 Go 中殺死我的進程,我有辦法殺死我調用的可執行文件,有沒有辦法做到這一點?
查看完整描述

3 回答

?
慕無忌1623718

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,

}


查看完整回答
反對 回復 2021-12-07
?
汪汪一只貓

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)

})


查看完整回答
反對 回復 2021-12-07
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

我在 Go (golang) 中有一些代碼,有幾個不同的線程運行一個單獨的可執行文件。我想確保如果用戶在 Go 中殺死我的進程,我有辦法殺死我調用的可執行文件,有沒有辦法做到這一點?

我不清楚您所說的“運行不同的線程”是什么意思。我會假設:

  • 這些線程屬于“我調用的可執行文件”

  • 那些線程不一定是用 golang 寫的

  • 您無法控制它們的執行(即,您無法更改它們的代碼)

從這個意義上說,我們正在談論創建一個進程組并確保當您殺死一個進程時,該組中的所有其他進程也必須停止。此機制依賴于操作系統。

在當前版本中,有兩種可能性(參見包x/sys):


查看完整回答
反對 回復 2021-12-07
  • 3 回答
  • 0 關注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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