systemctl + Restart = alwaysとはどういう意味ですか?

systemctl + Restart = alwaysとはどういう意味ですか?

サービスを設定しました - 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またはいずれかを意味します。SIGINTSIGTERMSIGPIPE[...]

SIGHUPプロセスの再起動を要求する一般的な方法ですが、処理されずにプロセスが終了します。したがって、Restart=alwaysサービス自体がサポートしていない場合でも(または)を使用して再起動できます。Restart=on-successSIGHUP

alwaysまた、マニュアルページを読む限り、制限を無視して設定するわけではありません。StartLimitIntervalStartLimitBurst

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を使用しますがapachectlRestart=on-failuresystemd

しかし、systemd奇妙な場所にあるので、彼らはRestart=alwaysプロジェクト内のほとんどの長期実行サービスに対してこれがどのように設定されるかを支持しますsystemdsystemdこれは、サービス定義を理解しようとするとあまり役に立たないようです。

関連情報