サービスが失敗したときに任意のコマンドを実行する


11

サービスが失敗したときにスクリプトを実行したい。これに最も近いのはFailureAction=オプション([Service]セクションの下)ですが、再起動コマンドしか提供していません。

回答:


11

systemd.unit(5)に記載さOnFailure=れているセクション[Unit]にディレクティブがあります。次のように定義されます。

このユニットが「障害」状態になったときにアクティブになる1つ以上のユニットのスペース区切りリスト。

OnFailureJobMode=同じセクションに、OnFailure =ユニットをアクティブにするためのジョブモードを設定できるディレクティブもあります。)


これらのオプションはスクリプトではなく他のユニットを開始するように見えます。
tshepang

2
@シェパン:もちろん。systemdでは、ユニットはまあ、何かを行うための基本的なユニットです。スクリプトの単純なユニットを記述し、/etc/systemd/systemその下に配置して、その名前をOnFailure=ディレクティブに配置します。
intelfx 2015

2

ExecStopPostユニットを開始する代わりに、コマンドを直接実行することもできます。

OnFailure設定に満足できなかったので、探し続けましたExecStopPost

次の実際の例では、メインタスクが失敗した場合、systemdがgitコマンドを実行します。

[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環境変数で設定されます。systemd.execを参照してください。 (5)詳細については。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.