サービスが失敗したときにいくつかのスクリプトを実行したいと思います。私が見た最も近いのはFailureAction=
オプション([Service]
セクションの下)ですが、再起動コマンドのみを提供します。
答え1
OnFailure=
セクションにディレクティブがあります[Unit]
。システムユニット(5)。これは次のように定義されます。
このデバイスが「失敗」状態に入ったときにアクティブになる1つ以上のデバイスをスペースで区切ったリスト。
OnFailureJobMode=
(同じセクションには、OnFailure =デバイスを有効にするための作業モードを設定できるディレクティブもあります。)
答え2
ExecStopPost
デバイスを起動するのではなく、コマンドを直接実行することもできます。
私はこの設定が気に入らなかったので、探し続けるOnFailure
よりが見つかりましたExecStopPost
。
git
以下の実際の例では、基本操作が失敗すると、systemdはコマンドを実行します。
[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service
[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter
User=root
# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer
# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .
Restart=always
RestartSec=10
KillSignal=SIGKILL
[Install]
WantedBy=multi-user.target
https://www.freedesktop.org/software/systemd/man/systemd.service.html
ExecStopPost = サービスが停止した後に実行される追加のコマンド。これには、ExecStop =に設定されたコマンドが使用されているか、サービスにExecStop =が定義されていないか、サービスが予期せず終了する状況が含まれます。このパラメータは、ExecStart =について説明したのと同じスキームに従う複数のコマンドラインを使用します。これらの設定の使用はオプションです。指定子と環境変数の置換をサポートします。 ExecStop =とは異なり、この設定で指定されたコマンドは、サービスが正しく開始されず、再び終了したときに呼び出されます。
この設定は、サービスが正しく開始されない場合でも実行する必要があるクリーンアップ操作にお勧めします。この設定で構成されたコマンドは、サービスが途中で開始されず、不完全に初期化されたデータが残っている場合でも実行できるはずです。この設定で指定されたコマンドが実行されると、サービスのプロセスはすでに終了しているため、そのプロセスと通信しようとしないでください。
この設定で構成されたすべてのコマンドは、$ SERVICE_RESULT、$ EXIT_CODE、および$ EXIT_STATUS環境変数に設定されているサービスの結果コード、および基本プロセスの終了コードと状態で呼び出されます。 exec(5) 詳細を参照してください。 。