ホームページ > バックエンド開発 > Golang > Go で「Process.Signal」が子プロセスを強制終了しないのはなぜですか?

Go で「Process.Signal」が子プロセスを強制終了しないのはなぜですか?

Barbara Streisand
リリース: 2024-11-27 17:37:15
オリジナル
371 人が閲覧しました

Why Doesn't `Process.Signal` Kill Child Processes in Go?

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート