私は、それぞれサービスを実行している 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
長時間実行されるサービスに使用するのは、あまり「慣用的」ではないかもしれません。プログラムの実行中、そのようなサービスの状態は「実行中」ではなく「開始中」として表示されます。
どちらのパターンもそれほどエレガントではありませんが、書くのはかなり簡単で、問題なく動作すると思います :-)。