systemdでOnFailureを使用する正しい方法

systemdでOnFailureを使用する正しい方法

存在しない場合は、いくつかの構成ファイルを生成し、存在する場合は読み取るソフトウェアを実行するサービスがあります。私が直面していた問題は、これらのファイルが時々破損してソフトウェアが起動せず、サービスが失敗することです。この場合、そのファイルを削除してサービスを再起動したいと思います。

次のように失敗した場合に実行する必要があるサービスを作成しようとします。

[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)

ベストアンサー1

ノート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=inside を定義すると、[Service]systemd (最小 Fedora 27 バージョン 234) は次のエラーを表示します。

software.service:6: Unknown lvalue 'OnFailure' in section 'Service'

ログにこの内容が表示されているかどうかはわかりません...

おすすめ記事