防止Ctrl C 中斷Golang 中的exec.Command
使用exec.Command 啟動進程時可能會遇到Ctrl C 的中斷,即使透過signal.Notify 攔截中斷呼叫。出現此問題的原因是 shell 在收到 Ctrl C 後向整個進程組發送訊號。因此,使用 exec.Command 啟動的子進程也會受到影響。
緩解此問題並防止 Ctrl C 中斷對於子進程,在開始執行之前需要先與自己的進程組建立命令。這可以透過使用 syscall.SysProcAttr 結構的 SysProcAttr、Setpgid 和 Pgid 欄位來實現。
這是一個結合了此方法的修改範例:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, } 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("Received Ctrl + C") }() <-doneChannel }
透過此修改,當程式執行時按Ctrl C,輸出如下產生:
2015/10/16 10:05:50 Sleep start ^C2015/10/16 10:05:52 Received Ctrl + C
sleep指令繼續成功運行,示範了透過Ctrl C防止中斷。
以上是如何防止 Ctrl C 中斷 Go 中的 exec.Command?的詳細內容。更多資訊請關注PHP中文網其他相關文章!