systemdでプロセスの停止と開始の間に遅延を追加します。

systemdでプロセスの停止と開始の間に遅延を追加します。

非常に奇妙な問題がありますsystemd。メッセージを発行すると、systemctl restart前のプロセスが完了する前に新しいプロセスが開始されます。

これは、開始メッセージ(「ログオン」)の後に最後の終了メッセージ(「ログオフ」)が記録されるログで確認できます。

プロセスの停止と開始の間に遅延を追加する方法はありますか?

答え1

システムサービスファイルでRestartSecオプションを設定して、再起動遅延を追加できます。以下の例をご覧ください。

[Service]
Restart=always
RestartSec=30

このリンクをチェックしてくださいより多くの例を学びましょう。

答え2

RestartSec は、systemctl restart コマンドで特定のサービスを再起動する場合にのみ使用されるようです。

たとえば、AとBという2つのサービスがあります。

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

そして

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

systemctl restart Bを実行すると期待どおりに機能しますが... systemctl restart Aを実行すると、両方のサービスが遅延なく即座に停止して再起動します。

Systemdは明らかに、ユーザーが指定したサービスの構成値のみを使用し、そのサービスへの依存関係を無視します。

これは聞こえるほど珍しくありません。 Bがリモートサーバーと通信している場合、リモート側でクライアントを拒否するため、クイックスタートとストップが失敗する可能性があります。ただし、Aが更新され、Bが変更されない限り、Aは直接再起動されます。

Aに遅延を追加することでこの問題を解決することもできますが、Bが依存関係でないときにAにBを認識させてオブジェクトの分離を破るので、これを行う必要はありません。

答え3

ExecStopPostサービスが停止した後にコマンドを実行できるようにすることができます。

ExecStopPost=/bin/sleep 5

その後、サービスが停止するたびに(手動再起動またはサービス終了を含む)5秒間待ちます。停止後5秒以内には起動しません。

関連情報