GNU/Linux >> Linux の 問題 >  >> Debian

Debian – 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)

承認された回答:

:おそらく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」の違いは?
Debian
  1. Systemctlコマンドを使用してSystemdサービスを管理する方法

  2. Debian – DebianでAes-niを使用しますか?

  3. inotify を使用する適切な方法は何ですか?

  1. Systemdは/etc/init.dスクリプトをどのように使用しますか?

  2. Debianパッケージングを介してSystemdファイルを条件付きで有効にしますか?

  3. ダウン時に Systemd を使用してサービスを再起動する方法は?

  1. Debian –サービスはアクティブですが(終了しました)?

  2. Debian –このSystemdユニットファイルの始まりがわからない?

  3. Debian – Systemd:サービスはExecstart=とExecstop=の両方の設定を欠いています。拒否しますか?