Process.Signal を使用して子プロセスを強制終了しないのはなぜですか?
提供されたコード スニペットでは、プロセスは次のように想定されています。指定されたタイムアウト後に cmd.Process.Signal(syscall.SIGKILL) を使用して強制終了されました。ただし、タイムアウトが正しく機能しません。 「ジムは死んだ」と出力されたにもかかわらず、プロセスは実行され続け、「待機完了」は出力されません。
問題
ここでの問題は、次の事実に関連しています。 cmd.Process.Signal は子プロセスを強制終了しないこと。子プロセスには独自のプロセス グループがあり、個別に強制終了する必要があります。
解決策
この問題を解決するには、syscall.Getpgid とsyscall.Kill:
import "syscall" cmd := exec.Command(some_command) cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} cmd.Start() pgid, err := syscall.Getpgid(cmd.Process.Pid) if err == nil { syscall.Kill(-pgid, 15) // note the minus sign } cmd.Wait()
SysProcAttr.Setpgid = を使用するtrue の場合、子プロセス用に別のプロセス グループが作成されます。次に、syscall.Getpgid は子プロセスのプロセス グループ ID (pgid) を取得します。最後に、syscall.Kill(-pgid, 15) が呼び出され、プロセス グループ全体に SIGTERM シグナルが送信され、子プロセスとその子プロセスの両方が効果的に強制終了されます。
警告
このソリューションはすべてのプラットフォームで機能するとは限りません。 macOS と Linux で動作することが確認されていますが、他のオペレーティング システムでの動作は不明です。
以上がGo で「Process.Signal」が子プロセスを強制終了しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。