Systemd Restart=常に準拠していない

Systemd Restart=常に準拠していない

注:私はサービスを作成する方法とこの特定の問題を回避する方法を説明する記事を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'.

同様に、ワーカースクリプトが次の終了状態で複数回失敗した255場合systemd

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強制的にできる方法はありませんかいつも再試行するには数秒かかりますか?

答え1

Rahulの答えをもう少し拡張したいです。

systemdは何度も(StartLimitBurst)再起動を試み、試行回数に達すると試行を停止しますStartLimitIntervalSec。どちらのオプションもこのセクションに属します[unit]

実行間のデフォルト遅延は100ミリ秒(RestartSec)これは速度制限に非常に迅速に到達する可能性があります。

systemd は、デバイスに対して自動的に再起動を試みません。再起動戦略の定義:

設定されて起動制限に達したデバイスはRestart=再起動を試みませんが、後で手動で再起動でき、この時点から再起動ロジックが再びアクティブになります。

遅延時間が長くなると、その時間内にエラーカウンタに到達できなくなり、Rahulの回答が役に立ちましたStartLimitIntervalSec。正解は、とRestartSecをすべてStartLimitBurst合理的な値に設定することです。

答え2

はい、持っている。セクションでx再試行する前に待機する秒数を指定できます[Service]

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

ファイルを保存したら、デーモン構成を再ロードしてsystemd新しいファイルを認識していることを確認する必要があります。

systemctl daemon-reload

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

systemctl restart test

要求どおりにマニュアルを確認してください。

Restart=on-failure

良いおすすめのようです。

答え3

systemd は、再起動しようとする試みを放棄します。

いいえ、systemdは再起動を放棄します。しばらく。これはあなたが提供したログにはっきりと示されています。

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

ここで速度制限が始まります。

一時的な長さはサービス単位の設定を使用して指定されますStartLimitIntervalSec=。この設定は、この間隔内で速度制限メカニズムをトリガーするのに必要な開始回数を指定しますStartLimitBurst=。これら2つの設定のデフォルト値を含む、システムに通常のsystemdとの違いがない場合、10秒に5倍増加します。

StartLimitIntervalSec=0速度制限を無効にして、systemdが放棄せずに常に再試行するようにします。ただし、より良いアプローチは、サービスの終了頻度を減らすか、シャットダウンと再起動の間にレート制限しきい値を超えないように十分アイドル状態を維持することです。

速度制限は、サービスの終了方法に関係ありません。原因に関係なく、起動/再起動の試行回数に基づいてトリガされます。

追加読書

答え4

その後もサービスが再起動しない場合は、以前に有効になってrebootいることを確認してください。

sudo systemctl enable your.service

関連情報