
短縮版: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
完了するまで放置され、システムは通常どおり数秒でシャットダウンします。