サービスが特定のコード(終了コード0など)で終了したときにシステムを終了させる方法はありますか?

サービスが特定のコード(終了コード0など)で終了したときにシステムを終了させる方法はありますか?

私はそれぞれサービスを実行する複数のLinuxシステムを持っています。これは、これらのシステムで実行される唯一の重要なプロセスです。ただし、サービスの一部の内部状態の変更により、終了コード 0 で正常に停止することがあります。私が探しているのは、これが起こったときにシステム全体をシャットダウンする慣用的な方法です。デフォルトでは、myserviceがコード0で終了した場合、systemdはシステムを停止し、myserviceが0以外の結果コードで終了した場合はmyserviceを再起動したいと思います。

見つけることができるショートカットがありますか?

答え1

/etc/systemd/system/my_unit.service:

[Unit]
...
...

[Service]
Type=oneshot
ExecStart=/usr/bin/your_program
ExecStartPost=/usr/bin/systemctl poweroff
RestartSec=5
Restart=on-failure

[Install]
...
...

これはとても簡単です。もう一つの興味深い変数はman systemd.serviceおよびですman systemd.unit

答え2

[Unit]
...

[Service]
Type=exec  # or any other type you want, apart from "oneshot"
ExecStart=/usr/bin/your_program
ExecStopPost=/bin/sh -c \
        'if [ "$SERVICE_RESULT" = "success" ]; then systemctl poweroff; fi'
RestartSec=5
Restart=on-failure

お客様のサービスが以下を使用して作成されたType=oneshot場合オーダーの回答代わりに。Type=oneshot長期実行サービスの場合、これは非常に「慣用的」ではない可能性があります。プログラムが実行中の場合、そのサービスの状態は「実行中」ではなく「開始中」と表示されます。

これらのパターンのどれも非常にエレガントではありませんが、書くのはとても簡単でうまくいくと思います:-).

関連情報