Golang で Ctrl C による exec.Command の中断を防ぐ
exec.Command を使用してプロセスを開始すると、Ctrl C による中断が発生することがあります。割り込み呼び出しが signal.Notify 経由でインターセプトされた場合でも。この問題は、シェルが 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
スリープ コマンドは引き続き正常に実行され、Ctrl C による中断が防止されていることを示しています。
以上がCtrl C による Go の exec.Command の中断を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。