サービスを設定しました - calc_mem.service
次のように
Restart=on-failure
RestartSec=5
StartLimitInterval=400
StartLimitBurst=3
私の理解によると、上記の設定は次のことを行う必要があります。
エラーが原因でサービスが終了すると、サービスは3回の再試行を持ちます。
サービスは開始する前に5秒待ちます。
また、「再起動」が次のようになる可能性があることがわかりました。
Restart=always
障害が発生した場合はサービスを再起動する必要があることは理解できますが、これはどういう意味ですか Restart=always
?
この場合は、以下を設定する必要があります。 Restart=always
答え1
これsystemd.service
マニュアルページ値の説明Restart=
と再起動を引き起こすオプションの表があります。Always
キャップの指示に従ってください。
に設定すると
always
正常に終了したり、信号によって異常終了したり、タイムアウトしてもサービスを再開します。
この機能についての人々の考えはよくわかりませんが、たとえば、サービスが一定期間だけ実行されるか、または一定数の要求を処理し、可能なリソースを避けるために停止するように構成されているとします。漏れ。 systemdに再起動させると、サービス自体の実装がより明確になります。
ある意味、私たちは理由を尋ねることができます。いいえsystemdにこのオプションを含めます。障害発生時にサービスを再起動する機能があるため、サービスを再起動するオプションも含まれる場合があります。いつも、誰かが必要な場合に備えて。ポリシーではなくツールを提供してください。
さらに、「成功した終了」は、ここでかなり広く定義されている。
に設定すると、
on-success
サービスプロセスが完全に終了した場合にのみ再起動されます。この場合、クリーンな終了は終了コード0またはsignal、、、SIGHUP
またはいずれかを意味します。SIGINT
SIGTERM
SIGPIPE
[...]
SIGHUP
プロセスの再起動を要求する一般的な方法ですが、処理されずにプロセスが終了します。したがって、Restart=always
サービス自体がサポートしていない場合でも(または)を使用して再起動できます。Restart=on-success
SIGHUP
always
また、マニュアルページを読む限り、制限を無視して設定するわけではありません。StartLimitInterval
StartLimitBurst
StartLimitIntervalSec=
サービスの再起動には、デバイスの起動速度制限が適用され設定されますStartLimitBurst=
。詳細については、systemd.unit(5)を参照してください。再起動されたサービスは、開始制限に達した後にのみ障害状態になります。
答え2
に設定した場合失敗の場合、プロセスがゼロ以外の終了コードで終了した場合、または信号(コアダンプを含む、上記の4つの信号を除く)によって終了した場合、または作業タイムアウト(サービスの再ロードなど)によってサービスが再開されます。設定された監視タイムアウトがトリガされたとき。 [...]に設定されている場合いつも、サービスが正常に終了したか、信号によって異常終了したか、タイムアウトしたかにかかわらず、サービスが再開されます。
から抜粋https://www.freedesktop.org/software/systemd/man/systemd.service.html
したがって、設定すると、完全にシャットダウンon-failure
しても再起動されません。
答え3
@JdeBPはこれを見る別の方法があることを示唆しています。
Restart=always
より簡単です。実装しやすく理解しやすいです。サービスが終了コード0(EXIT_SUCCESS
)で終了したことを確認するのはなぜですか?サービスが終了してはならない終了コード0で終了する奇妙なバグ/エラーがあるかもしれません。
A1:一部のユニットは利用できませんRestart=always
。特にアイドルタイムアウト後にサービスが終了する場合です。
興味深いことに、バグ/エラーによってそのようなサービスが「成功的に」終了する場合(終了してはいけない場合)、それほど重要ではありません。アイドルタイムアウトは、新しい要求があったときにサービスが自動的に開始されるように設定されたことを意味するためです。
ただし、Restart=on-failure
一部の構成ではアイドル状態で終了することができますが、他の構成では終了できないサービスに使用できます。 systemd-networkd
この理由で使用してください。
回答2:システム管理慣行には、これを防ぐためにメッセージサービスプロセスを終了またはブロックすることが含まれる場合があります。時には人々は簡単なコマンドkill
を使用しますがapachectl
。Restart=on-failure
systemd
しかし、systemd
奇妙な場所にあるので、彼らはRestart=always
プロジェクト内のほとんどの長期実行サービスに対してこれがどのように設定されるかを支持しますsystemd
。systemd
これは、サービス定義を理解しようとするとあまり役に立たないようです。