Go アプリケーション内で外部プログラムまたはプロセスを実行する場合、これらのプロセスを確実に終了できるようにすることが重要ですユーザーまたは予期しないイベントによって親 Go プロセスが終了されると、正常に終了します。これにより、適切なリソース管理が確保され、アプリケーションの終了後に孤立したプロセスが存続することが防止されます。
これを実現するには、主に 2 つの方法が使用できます。
1 つのアプローチには、親 Go プロセスと同じプロセス グループで子プロセスを開始することが含まれます。これは、親プロセスが (ユーザーが SIGTERM または SIGKILL シグナルを送信するなどして) 強制終了されると、子プロセスを含むプロセス グループ全体も終了されることを意味します。
プロセス グループの共有を設定するには、exec.Cmd 構造体の SysProcAttr フィールドを使用します:
cmd := exec.Command("./long-process") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
2 番目のアプローチでは、syscall.SysProcAttr 構造体の Pdeathsig フィールドを使用します。これにより、親プロセスの終了時に子プロセスに送信するシグナルを指定できます。デフォルトでは、Pdeathsig は 0 に設定されており、特定の信号が送信されないことを意味します。ただし、syscall.SIGTERM などの有効なシグナル値に設定して、オペレーティング システムによって突然終了される前に子プロセスがシグナルを確実に受信できるようにすることができます。
cmd := exec.Command("./long-process") cmd.SysProcAttr = &syscall.SysProcAttr{ Pdeathsig: syscall.SIGTERM, }
Pdeathsig の設定に加えて、Go コードにシグナル ハンドラーを実装して、一般的な終了シグナルをインターセプトすることもできます。
SIG_KILL シグナルは通常のシグナルを明示的にバイパスするため、一般にキャッチすることはできないことに注意してください。ハンドラー。したがって、ほとんどのシナリオで確実に正常に終了するには、上記のような堅牢な方法を使用することが不可欠です。
以上がGo アプリケーションから呼び出された外部プロセスを確実に正常に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。