簡潔なバージョン:systemdが制御するサービスを即座に終了する方法は?
(fork / exec'd)で終わるシェルスクリプトを使用して、特定のイベントに応答して任意のアクションを実行できるデーモンがあります。
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