違います
メイン プロセスは、通常の方法でその子プロセスの終了を処理します。
これがPOSIXの世界です。プロセス A が B をフォークし、プロセス B が C、D、および E をフォークした場合。次に、プロセス B が SIGCHLD
を認識します。 と wait()
C、D、および E の終了からのステータス。プロセス A は、C、D、および E に何が起こるかを認識しておらず、これは systemd とは関係ありません。
A が C、D、および E の終了を認識するためには、2 つのことが発生する必要があります。
- A は自分自身を「サブリーパー」として登録する必要があります。 systemd はこれを行い、upstart や nosh
service-manager
を含む他のさまざまなサービス マネージャーも同様です。 . - B は
exit()
しなければなりません .愚かにも、誤って、無駄に自分自身を「悪魔化」しようとするサービスは、これを行います.
(kevent()
で賢くなることができます BSDで。しかし、これは Linux に関する質問です。)
systemd
メインプロセスの概念を持っています。 systemd のドキュメントでは、これは「メイン サービス プロセス」または単に「メイン プロセス」と呼ばれています。
systemd.service ドキュメントの例 4 では、Type=forking
のときにメイン プロセスが計算されると説明しています。 .
Restart=
のドキュメント systemd.service ドキュメントでは、メイン プロセスに関連してサービスが開始されるときのさまざまな可能性について説明しています。
上にリンクされた「例 4」の重要なテキストは次のとおりです。
<ブロック引用>systemd は、元のプログラムがまだ実行されている間、サービスが初期化の過程にあると見なします。 itexit が正常に終了し、少なくともプロセスが残っている (andRemainAfterExit=no) と、サービスは開始されたと見なされます。
多くの場合、従来のデーモンは 1 つのプロセスのみで構成されています。したがって、元のプロセスが終了した後にプロセスが 1 つしか残っていない場合、systemd はそのプロセスをサービスのメインプロセスと見なします。その場合、$MAINPID 変数は ExecReload=、ExecStop=などで使用できます。
複数のプロセスが残っている場合、systemd はメイン プロセスを特定できないため、メイン プロセスが存在するとは見なしません。その場合、$MAINPID は何にも展開されません。ただし、プロセスが従来の PID ファイルを書き込むことを決定した場合、systemd はそこからメインの PID を読み取ることができます。それに応じて PIDFile=を設定してください。