いくつかの構成ファイルが存在しない場合はそれらを生成し、存在する場合はそれらを読み取るソフトウェアを実行しているサービスがあります。私が直面している問題は、これらのファイルが破損してソフトウェアを起動できなくなり、サービスが失敗することがあるということです。この場合、これらのファイルを削除してサービスを再開したいと思います。
失敗した場合に実行されるサービスを作成してみました:
[Service]
ExecStart=/bin/run_program
OnFailure=software-fail.service
このサービスの場所:
[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=systemctl --user start software.service
ただし、問題は、サービスが失敗してもこのサービスが開始されないことです。
やってみました
systemctl --user enable software-fail.service
ただし、他のサービスと同様に、システムが起動するたびに起動します。
私の一時的な解決策は使用することです
ExecStopPost=/bin/rm /file/to/delete
ただし、これは満足のいく解決方法ではありません。障害が原因であるかどうかに関係なく、サービスの停止時に常にファイルが削除されるためです。
失敗したときの出力:
● software.service - Software
Loaded: loaded (/home/trippelganger/.config/systemd/user/software.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2018-05-04 09:05:26 CEST; 5s ago
Process: 1839 ExecStart=/bin/run_program (code=exited, status=1/FAILURE)
Main PID: 1839 (code=exited, status=1/FAILURE)
May 04 09:05:26 trippelganger systemd[595]: software.service: Main process exited, code=exited, status=1/FAILURE
May 04 09:05:26 trippelganger systemd[595]: software.service: Unit entered failed state.
May 04 09:05:26 trippelganger systemd[595]: software.service: Failed with result 'exit-code'.
systemctl –user status software-fail.service
の出力は次のとおりです:
● software-fail.service - Delete corrupt files
Loaded: loaded (/home/trippelganger/.config/systemd/user/software-fail.service; disabled; vendor preset: enabled)
Active: inactive (dead)
承認された回答:
注 :おそらくExecStopPost=
を使用したいと思うでしょう OnFailure=
の代わりに ここ(私の他の答えを参照)、しかしこれはあなたのOnFailure=
の理由に対処しようとしています セットアップが機能していません。
OnFailure=
の問題 ユニットが起動しないのは、セクションが間違っているためである可能性があります。[Unit]
にある必要があります [Service]
ではなくセクション 。
代わりにこれを試すことができます:
# software.service
[Unit]
Description=Software
OnFailure=software-fail.service
[Service]
ExecStart=/bin/run_program
そして:
# software-fail.service
[Unit]
Description=Delete corrupt files
[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=/bin/systemctl --user start software.service
この設定で動作させることができます。
ただし、OnFailure=
を使用することに注意してください プログラムが失敗した理由がわからないため、ここでは理想的ではありません。また、ExecStop=
でプログラムの別の開始をチェーンします。 /bin/systemctl start
を呼び出す 直接はかなりハッキーです…ExecStopPost=
を使用したソリューション 終了ステータスを確認することは間違いなく優れています。
OnFailure=
を定義する場合 [Service]
内 、systemd(少なくともFedora 27のバージョン234)は次のように文句を言います:
software.service:6: Unknown lvalue 'OnFailure' in section 'Service'
ログにそれが表示されているかどうかわからない…(これは最近のsystemdで追加されたのでしょうか?)それはそこで起こっていることのヒントになるはずです。
関連:「>」と「-gt」の違いは?