防止Ctrl C 中斷exec.Command 進程
儘管透過signal.Notify 攔截中斷調用,但以exec.Command 啟動的進程仍然容易受到影響透過Ctrl C 中斷。請考慮以下事項示範:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func main() { var doneChannel = make(chan bool) go func() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") }() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { <-c log.Println("Receved Ctrl + C") }() <-doneChannel }
在程式執行期間按 Ctrl C 將產生指示「睡眠」指令被中斷的輸出,儘管主程式沒有退出。
解決方案:控制進程組
按下 Ctrl C 時 shell 向整個進程組發出訊號會導致中斷。為了將子進程與此訊號隔離,該命令必須在其自己的進程組中啟動。這可以透過在啟動程序之前設定SysProcAttr.Setpgid 和SysProcAttr.Pgid 欄位來實現:
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
執行下列步驟,主程式可以攔截Ctrl C 訊號,而不會中斷使用exec.Command 啟動的進程,確保流程穩定執行。
以上是如何防止 Ctrl C 中斷 Go 中的 `exec.Command` 進程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!