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

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

私は、それぞれサービスを実行している Linux ボックスをいくつか持っています。これは、これらのマシンで実行されている唯一の重要なプロセスです。ただし、サービスの内部状態の変化により、終了コード 0 で正常に停止することがあります。私が探しているのは、このような状況が発生したときにシステム全体をシャットダウンする慣用的な方法です。基本的に、myservice サービスがコード 0 で終了したときに systemd がシステムを停止し、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長時間実行されるサービスに使用するのは、あまり「慣用的」ではないかもしれません。プログラムの実行中、そのようなサービスの状態は「実行中」ではなく「開始中」として表示されます。

どちらのパターンもそれほどエレガントではありませんが、書くのはかなり簡単で、問題なく動作すると思います :-)。

関連情報