ホームページ >バックエンド開発 >Golang >親プロセスが終了したときに systemd が子プロセスを強制終了しないようにするにはどうすればよいですか?

親プロセスが終了したときに systemd が子プロセスを強制終了しないようにするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-21 04:57:09705ブラウズ

How can I prevent systemd from killing child processes when the parent process terminates?

Systemd での子プロセスの処理: プロセス切断の問題の解決

長時間実行される子プロセスを生成する場合、メイン プロセスの存続期間を超えて子プロセスが確実に存続するようにすることが重要です。特に 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。