Systemd Restart = alwaysは尊重されません


54

注:Mediumで、サービスの作成方法と、この特定の問題を回避する方法を説明した記事を書きました:systemdを使用したLinuxサービスの作成

元の質問:


systemdを使用して、常にワーカースクリプトを動作させています。

[Unit]
Description=My worker
After=mysqld.service

[Service]
Type=simple
Restart=always
ExecStart=/path/to/script

[Install]
WantedBy=multi-user.target

数分後にスクリプトが正常に終了した場合、再起動は正常に機能しますが、起動時に繰り返し実行に失敗すると、起動systemdしようとしてあきらめます。

Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.

同様に、私のワーカースクリプトはの終了ステータスで数回失敗した場合255systemdそれを再起動しようと諦め:

Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.  
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.

数秒後systemd常に再試行を強制する方法はありますか?

回答:


53

Rahulの答えを少し拡張したいと思います。

SystemDは複数回再起動を試み(StartLimitBurst)、試行回数が以内に達すると試行を停止しますStartLimitIntervalSec。両方のオプションは[unit]セクションに属します。

実行間のデフォルトの遅延は100ミリ秒(RestartSec)であり、これによりレート制限に非常に速く到達します。

SystemDは、再起動ポリシーが定義されているユニットに対してこれ以上自動再起動を試行しません。

構成されRestart=、開始制限に達するユニットは、再起動されないことに注意してください。ただし、後で手動で再起動する場合があり、その時点から再起動ロジックが再びアクティブになります。

Rahulの答えは、長い遅延がStartLimitIntervalSec時間内にエラーカウンターに到達することを妨げるため、役立ちます。正しい答えは、両方RestartSecStartLimitBurst適切な値を設定することです。


5
試行錯誤の末、(最終的に)動作の仕組みを理解したので、あなたの答えが最も正しいことがわかります。私にとってStartLimitIntervalSec=0一番重要なのは、設定と無効です。
ベンジャミン

35

はい、あります。セクションのx下で数秒後に再試行するように指定できますが[Service]

[Service]
Type=simple
Restart=always
RestartSec=3
ExecStart=/path/to/script

ファイルを保存したら、デーモン構成をリロードしてsystemd、新しいファイルを認識できるようにする必要があります。

systemctl daemon-reload

その後、サービスを再起動して変更を有効にし、

systemctl restart test

あなたが要求したように、ドキュメントを見て、

Restart=on-failure

適切な推奨のように聞こえます。


本当にうまくいくようです、ありがとう!したがって、これをよりよく理解するには、RestartSecディレクティブなしで、数回のsystemd再起動を非常に迅速に試行し、その後永続的な障害状態に入ります。何かすることはできません場合に発生RestartSec指定されていますか?
ベンジャミン

また、ワーカーの「通常の」再起動が遅れることに気付きました(数分後に意図的にワーカーを正常に終了しています)。失敗した再起動のみを遅らせる方法はありますか?
ベンジャミン

私の更新情報を参照してください@Benjamin
ラーフル

@Benjaminでは、ここでその他のパラメーターを確認できます。
ラーフル

3
docから判断するalwaysと、のスーパーセットでon-failureあるため、役に立ちません!
ベンジャミン

5

systemdは、再起動を試みることを断念します

いいえ。systemdはしばらくの間、再起動を試行することを断念ます。これは、指定したログに明確に表示されます。

6月14日11:25:51 localhost systemd [1]:test.service:結果 'start-limit'で失敗しました

これは、レート制限の開始です。

少しの間の長さは、StartLimitIntervalSec=設定を使用して、サービス単位で指定されます。その間隔内でレート制限メカニズムをトリガーするために必要な開始回数は、StartLimitBurst=設定を介して指定されます。これらの2つの設定のデフォルトを含め、システム上でバニラsystemdと何の違いもない場合、10秒以内に5回です。

StartLimitIntervalSec=0レート制限を無効にするため、systemdはあきらめることなく永久に再試行します。ただし、サービスが頻繁に終了しないようにするか、終了と再起動の間にアイドル状態にしてレート制限しきい値を超えないようにするのが、より良いアプローチです。

レート制限は、サービスの終了方法を気にしないことに注意してください。原因に関係なく、起動/再起動の試行回数でトリガーされます。

参考文献


5
ただし、恒久的にあきらめているようです:「アクティブ:失敗(結果:start-limit)2016年6月15日水曜日01:21:24 CEST; 12時間前」。この状態のままで、スクリプトは二度と実行されません。私は手動で設定しようとしたんStartLimitIntervalSec=10StartLimitIntervalSec=5、運を。
ベンジャミン

5
デフォルトでは永久にgiveめます。github.com/systemd/systemd/issues/2416を参照してください。
アダムグッド

2
一番下の行:永続的にあきらめるのを防ぐには、を設定しStartLimitIntervalSec=0ます。
ベンジャミン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.