web-dev-qa-db-ja.com

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

それぞれがサービスを実行しているLinuxボックスはほとんどありません。これは、これらのマシンで実行される唯一の重要なプロセスです。ただし、サービスの内部状態の変化が原因で、終了コード0で正常に停止することがあります。これが発生したときにシステム全体をシャットダウンする慣用的な方法があります。基本的に、myserviceサービスがコード0で終了したときにsystemdがシステムを停止し、ゼロ以外の結果コードで終了した場合はmyserviceを再起動します。

これを行う簡単な方法はありますか?

3
Museful
[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を使用して記述されている場合は、代わりに Oxyd's answer のパターンが必要です。長期実行サービスにType=oneshotを使用することは、あまり「慣用的」ではないかもしれません。プログラムが実行中の場合、そのようなサービスの状態は「実行中」ではなく「開始中」として表示されます。

これらのパターンはどちらも非常にエレガントではありませんが、書くのはかなり簡単で、問題なく動作するはずです:-)。

3
sourcejedi

/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.serviceman systemd.unitにあります。

3
Oxyd