長時間実行される子プロセスを生成する場合、メイン プロセスの存続期間を超えて子プロセスが確実に存続するようにすることが重要です。特に systemd によって管理されている場合。シナリオによっては、子プロセスが予期せず終了し、重要なバックグラウンド タスクが処理されないままになることがあります。
go プログラミング言語を使用して子プロセスを開始するメイン プロセスを作成しようとしたときに発生した次の問題を考えてみましょう:
package main import ( "log" "os" "os/exec" "syscall" "time" ) func main() { if len(os.Args) == 2 && os.Args[1] == "child" { for { time.Sleep(time.Second) } } else { cmd := exec.Command(os.Args[0], "child") cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true} log.Printf("child exited: %v", cmd.Run()) } }
ターミナルからこのプログラムを実行すると、メインプロセスが停止または終了した後でも子プロセスが存続します (Ctrl Z および kill -INT 7914)。ただし、メイン プロセスが systemd サービスとして開始されると、子プロセスも突然終了します。
この問題を解決するには、systemd サービス ファイル (/etc/systemd/system/exectest.service) を変更して次のことを行います。次の行:
KillMode=process
この設定は、systemd にメイン プロセスのみを強制終了し、子プロセスの実行を継続するように指示します。デフォルトでは、systemd はコントロール グループ モードを使用し、メイン プロセスと同じコントロール グループ内のすべてのプロセスを強制終了します。
更新された systemd サービス ファイル:
[Unit] Description=ExecTest [Service] Type=simple ExecStart=/home/snowm/src/exectest/exectest User=snowm KillMode=process [Install] WantedBy=multi-user.target
この変更により、子プロセスはメインプロセスの終了後も存続し、バックグラウンドタスクの安定性と継続性を確保します。
以上が親プロセスが終了したときに systemd が子プロセスを強制終了しないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。