防止Ctrl C 中斷Golang 中的exec.Command
使用exec.Command 執行指令時,了解潛在的風險至關重要對於Ctrl C 中斷,即使使用signal.Notify 來攔截此類訊號。在以下範例中可以觀察到此問題:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") } func main() { var doneChannel = make(chan bool) go sleep() 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,輸出表示「睡眠」指令中斷,即使主程式繼續運作:
2015/10/16 10:05:50 Sleep start ^C2015/10/16 10:05:52 Receved Ctrl + C 2015/10/16 10:05:52 Sleep stop
解決此問題的關鍵在於認識到按下Ctrl C 時shell 會向整個進程組發出信號。可以透過使用syscall.SysProcAttr 中的Setpgid 和Pgid 欄位在其自己的進程組中啟動命令來防止此行為:
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
透過合併此修改,「睡眠」命令將不再中斷Ctrl C,讓它繼續獨立運作。
以上是如何防止 Ctrl C 中斷 Go 中的 `exec.Command`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!