Systemdサービスを障害時に自動的に再起動させたい。さらに、再起動をレート制限したいと思います。 90秒以内に最大3回の再起動を許可します。したがって、次の構成を行いました。
[サービス]
再起動=常に
StartLimitInterval = 90
StartLimitBurst = 3
これで、障害時にサービスが再起動されます。 3つのクイック障害/再起動後、期待どおりに再起動しなくなりました。今、私はsystemdがタイムアウト(StartLimitInterval)後にサービスを開始することを期待していました。しかし、タイムアウト後にサービスを手動で再起動した場合、システムがタイムアウト(90秒)後にサービスを自動的に開始しません。しかし、私はsystemdがStartLimitIntervalの後でサービスを自動的に開始するようにします。この機能の実現方法を教えてください。
サービスを90秒間隔で3回再起動するには、systemdサービスファイルに次の行を含めます。
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
これは、「Type = idle」を使用してスクリプトを実行するサービスで機能しました。 「StartLimitInterval」は「RestartSec * StartLimitBurst」より大きくなければならないことに注意してください。そうしないと、サービスが無期限に再起動されます。
Systemdがこれらのオプションをどのように使用するかを理解するには、多くの試行錯誤を繰り返しましたが、systemdが期待どおりに文書化されていないことを示唆しています。これらのオプションは、私が探していた再試行サイクル時間と最大再試行を効果的に提供します。
数年後、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カウントで停止します。
説明する動作はドキュメントと一致しています。
StartLimitInterval =、StartLimitBurst = サービスの開始レート制限を構成します。デフォルトでは、10秒以内に5回以上開始されたサービスは、10秒の間隔が終了するまで、それ以上開始できません。これらの2つのオプションを使用すると、このレート制限を変更できます。 StartLimitInterval =を使用してチェック間隔を構成します(マネージャー構成ファイルではデフォルトでDefaultStartLimitInterval =に設定され、あらゆる種類のレート制限を無効にするには0に設定します)。 StartLimitBurst =を使用して、間隔ごとに許可される開始の数を構成します(マネージャー構成ファイルのデフォルトはDefaultStartLimitBurst =です)。これらの設定オプションは、Restart =と併用すると特に役立ちます。ただし、Restart =ロジックによってトリガーされるものだけでなく、すべての種類の開始(手動を含む)に適用されます。 Restart =に設定され、開始制限に達したユニットは、再起動を試みないことに注意してください。ただし、後から手動で再起動することもできます。その時点から、再起動ロジックが再びアクティブになります。systemctl reset-failedにより、サービスの再起動率カウンターがこれはフラッシュされます。これは、管理者が手動でサービスを開始する必要があり、開始制限がそれを妨げる場合に役立ちます。
私はまだあなたが望む行動を達成する方法を理解しようとしています。
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です。
これが失敗したときに別のサービスを開始するようにOnFailure
を設定できます。 on-fail serviceでは、サービスを待機してから再起動するスクリプトを実行できます。
これをセットアップする方法のサンプルについては、 ユニット障害時のSystemdステータスメール を参照して、サービスを再起動するように変更してください。