systemdでサービスを停止する

systemdでサービスを停止する

簡潔なバージョン: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

おすすめ記事