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


10

で本当に奇妙な問題がありsystemdます。私が発行するsystemctl restartと、前のプロセスが完了する前に新しいプロセスが開始されます。

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

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


実行をsystemctl stop myservice && sleep 3 && systemctl start myservice
妨げる

なぜそれが奇妙なのですか?これは、現実世界の問題を回避するためにあなたを一人にしておく設計機能です。ユニットスタートにスリープを挿入するか、ExecPre条件を使用して、古いインスタンスが完全になくなるようにします。
Florian Heigl

回答:


13

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

[Service]
Restart=always
RestartSec=30

他の例については、このリンク確認してください


1
afaik RestartSecは、Restart=ディレクティブで構成されたサービスにのみ適用され、実行時に考慮されませんsystemctl restart someservice
don_crissti

1

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は明らかに、指定した1つのサービスの構成値のみを使用しており、依存関係についてはそれらを無視しています。

これは思ったほど珍しいことではありません。Bがリモートサーバーと通信する場合、リモートエンドがクライアントを拒否するため、迅速な起動と停止が失敗する可能性があります。ただし、Aを直接再起動すると、Bを変更せずにAが更新されます。

おそらくAにも遅延を追加することでこれを回避できますが、依存関係ではないときにAにBを知らせてオブジェクトの分離を壊すため、これを行う必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.