systemd サービスによる停止

systemd サービスによる停止

短縮版:systemd 制御サービスで即時シャットダウンをトリガーするにはどうすればよいですか?


私は、特定のイベントに応じて任意のことを実行する権限を与えられたデーモンを持っています。(fork/execされた)シェルスクリプトは次のように終わります。

exec halt -p

または、より具体的にはexec $@、 ですが、この場合は$@ですhalt -p。私は以下も試しました:

  • shutdown now
  • systemctl halt

これは動作しますが、通常であれば数秒しかかからないシャットダウンに数分かかるという問題があるようです。これは、systemd が、halt要求に応じて丁寧に終了しないサービス (サービス自体) の子プロセスを待機しているためではないかと考えています。つまり、これは蛇が自分の尻尾を追いかけるような状況です。

このサービスには はなくExecStopですType=forking

答え1

オプションについてはman systemd.kill次の説明がありますKillMode:

KillMode=

このユニットのプロセスをどのように終了するかを指定します。制御グループ、プロセス、混合、なし。

設定した場合対照群、このユニットの制御グループ内の残りのすべてのプロセスは、ユニットの停止時に強制終了されます (サービスの場合: で設定されたとおり、停止コマンドが実行された後ExecStop=)。

これは、カスタマイズExecStopだけでは役に立たないことを意味しますが、次のようになります。

設定した場合プロセスメインプロセス自体のみが強制終了されます。

設定した場合なしプロセスは終了しません。この場合、ユニット停止時に停止コマンドのみが実行されます。

したがって、ExecStopは と組み合わせて使用​​できますKillMode=none。デーモンが永続プロセスを開始した場合に、 ではなく をターゲットにするためにこれが必要になりますhalt。私のケースではそうではなく、デーモン自体にハンドラーがありSIGTERM、子プロセスを待機しないため、特別なクリーンアップは必要ありません。したがって、 ブロックKillMode=processに を追加することで[Service]問題は解決しました。デーモンは停止し、 がhalt完了するまで放置され、システムは通常どおり数秒でシャットダウンします。

関連情報