StartLimitInterval後のsystemdサービスの自動再起動


33

systemdサービスが障害時に自動的に再起動されるようにします。さらに、再起動のレート制限を行います。90秒以内に最大3回の再起動を許可したい。したがって、次の構成を行いました。

[サービス]
Restart = always
StartLimitInterval = 90
StartLimitBurst = 3

これで、障害時にサービスが再開されます。3回のクイック障害/再起動後、期待どおりに再起動しなくなりました。今、私はsystemdがタイムアウト(StartLimitInterval)の後にサービスを開始することを期待しました。しかし、タイムアウトの後に手動でサービスを再起動すると、systemdはタイムアウト(90秒)後にサービスを自動的に開始しません。しかし、systemdがStartLimitIntervalの後にサービスを自動的に開始するようにしたいのです。この機能を実現する方法を教えてください。


3
サービスを作成する方法と、この特定の問題を回避する方法を説明する記事を書きました:systemdでLinuxサービスを作成します。
ベンジャミン

2
探しているのでStartLimitIntervalSecはなく、探していると思いますStartLimitInterval
マークタムスキー

回答:


30

サービスを90秒間隔で3回再起動するには、systemdサービスファイルに次の行を含めます。

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

これは、「Type = idle」を使用してスクリプトを実行するサービスで機能しました。「StartLimitInterval」は「RestartSec * StartLimitBurst」よりも大きい必要があることに注意してください。そうでない場合、サービスは無期限に再起動されます。

systemdがこれらのオプションをどのように使用するかを解明するのに、多くの試行錯誤を繰り返しました。これらのオプションは、私が探していた再試行サイクル時間と最大再試行回数を効果的に提供します。


これは承認済みの回答としてマークする必要があります
ジェフ

StartLimitInterval=私の最新のubuntu 18でディレクティブを見つけることができません...

10

説明する動作は、ドキュメントと一致しています。

StartLimitInterval =、StartLimitBurst = 制限を設定し、サービス開始率。デフォルトでは、10秒以内に5回以上開始されたサービスは、10秒間隔が終了するまでこれ以上開始できません。これら2つのオプションを使用すると、このレート制限を変更できます。StartLimitInterval =を使用して、チェック間隔を構成します(マネージャー構成ファイルのデフォルトはDefaultStartLimitInterval =に設定されています。0に設定すると、あらゆる種類のレート制限が無効になります)。StartLimitBurst =を使用して、許可される間隔ごとの開始回数を構成します(マネージャー構成ファイルのデフォルトはDefaultStartLimitBurst =です)。これらの構成オプションは、Restart =と組み合わせて使用​​すると特に便利です。ただし、Restart =ロジックによってトリガーされるものだけでなく、すべての種類の開始(手動を含む)に適用されます。Restart =に設定され、開始制限に達したユニットは、再起動されないことに注意してください。ただし、後で手動で再起動する場合があり、その時点から再起動ロジックが再びアクティブになります。systemctl reset-failedは、サービスの再起動率カウンターをフラッシュすることに注意してください。これは、管理者がサービスを手動で開始したい場合に便利で、開始制限がそれに干渉します。

私はまだあなたが望む行動を達成する方法を見つけようとしています。


あなたが指摘するように、これは答えというよりもコメントです。
デイブM

まさに必要なもの、ty
一部のLinux Nerd

あなたがリンクした文書によると、それはすべきではないStartLimitIntervalSec=(とDefaultStartLimitIntervalSec=)?Sec両方のパラメーター名への追加に注意してください。
ドクターJ

6

数年後、systemd 232では、質問と2016年の回答で説明されているように、機能しなくなりました。オプション名StartLimitIntervalSecとセクションが変更されました。次の例のようになります。

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

これにより、30秒で5回の再起動(5 * 6)と33秒で1回の再起動が行われます。したがって、33秒で6回再起動します。これは、33秒で5回の再起動という制限を超えています。したがって、再起動は約31秒後に5カウントで停止します。


1
セクションでStartLimitIntervalドキュメント化されていない場合でも、まだサポートされているようですService。しかし、新しい優先はでStartLimitIntervalSecのみ機能しUnitます。
ダネクデュバル

1

OnFailureこれが失敗したときに別のサービスを開始するように設定できます。フェイルサービスあなたは待っているスクリプトを実行して、あなたのサービスを再起動しますすることができます。

これを設定する方法のサンプルについては、ユニット障害時のSystemdステータスメールを参照し、代わりにサービスを再起動するように変更してください。


1

を使用できますStartLimitAction=reboot。これにより、StartLimitIntervalの後にシステムが再起動します。

StartLimitAction = StartLimitInterval =およびStartLimitBurst =で設定されたレート制限に達した場合に実行するアクションを設定します。none、reboot、reboot-force、またはreboot-immediateのいずれかを取ります。何も設定されていない場合、レート制限に到達しても、開始が許可されない以外のアクションはトリガーされません。rebootは、通常のシャットダウン手順に従って再起動します(つまり、systemctl rebootと同等)。reboot-forceはすべてのプロセスを強制的に終了する強制再起動を引き起こしますが、再起動時にダーティなファイルシステムを引き起こさず(つまり、systemctl reboot -fと同等)、reboot-immediateによってreboot(2)システムコールが即座に実行されます。データ損失。デフォルトはnoneです。

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