exec.Command プロセスの Ctrl C 割り込みの防止
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 を押したときにシェルがプロセス グループ全体に通知することで中断が発生します。が押されます。子プロセスをこのシグナルから分離するには、コマンドを独自のプロセス グループで開始する必要があります。これは、プロセスを開始する前に SysProcAttr.Setpgid フィールドと SysProcAttr.Pgid フィールドを設定することで実現できます:
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
これらの手順に従うことで、メイン プログラムは exec.Command で開始されたプロセスを中断することなく Ctrl C 信号をインターセプトできます。安定したプロセス実行を保証します。
以上がGo で Ctrl C が `exec.Command` プロセスを中断しないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。