web-dev-qa-db-ja.com

systemdでサービスが開始される前に遅延があることを確認する方法は?

Cassandraが正常に起動し、クラスターが起動して準備ができていることに依存するサービスがあります。

依存関係の順序が満たされていることを確認するために、次のユニットファイルがあります

[Unit]
Requires=cassandra.service
After=cassandra.service

[Service]
Environment=Java_HOME=/usr/Java/jre
[email protected]@/webapps/bringup-app/bin/bringup
TimeoutStartSec=0
ExecStop=
[email protected]@/logs/bringup.pid
Restart=always

[Install]
WantedBy=multi-user.target

Bringup-appプロセスが起動を試みる前に30秒間待機するようにするにはどうすればよいですか?現在、Cassandraの後に起動していますが、Cassandraクラスターがまだ起動していないため、bringup-appからCassandraへの接続試行が失敗することに気付きました。

したがって、遅延を追加します。ユニットファイル経由で可能ですか?

33

ExecStart の前に sleep コマンドを実行できます ExecStartPre で:

[Service]
ExecStartPre=/bin/sleep 30
46
Ortomala Lokni

.timer systemdユニットファイルを作成して、.serviceユニットファイルの実行を制御できます。

たとえば、起動後1分間待ってからfoo.serviceを開始するには、同じディレクトリにfoo.timerファイルを作成し、その内容を次のようにします。

[Timer]
OnBootSec=1min

このすべてが機能するためには、サービスが無効になっている(したがって、起動時に開始されない)タイマーが有効になっていることが重要です(これはユーザー tride のおかげです):

systemctl disable foo.service
systemctl enable foo.timer

ここには、さらに多くのオプションと必要なすべての情報があります: https://wiki.archlinux.org/index.php/Systemd/Timers

17
Zantsu

Bringupサービスを編集する代わりに、依存するサービスに開始後の遅延を追加します。 cassandra.serviceを次のように編集します:

ExecStartPost=/bin/sleep 30

このように、追加のスリープは、それに依存するサービスの開始の再起動を遅くするべきではありません(独自の起動を遅くしますが、それが望ましいでしょうか?)。

7
bviktor

スーパーユーザーに関するこの答えは、より良い答えだと思います。から https://superuser.com/a/573761/67952

「しかし、BeforeとAfterを使用せずに方法を要求したので、以下を使用できます。

Type=idle

man systemd.serviceが説明するように

アイドルの動作は単純に非常に似ています。ただし、すべてのアクティブなジョブがディスパッチされるまで、サービスプログラムの実際の実行は遅延します。これは、シェルサービスの出力とコンソールのステータス出力のインターリーブを回避するために使用できます。このタイプはコンソール出力の改善にのみ有用であり、一般的なユニット注文ツールとしては有用ではなく、このサービスタイプの効果は5秒のタイムアウトの影響を受けることに注意してください。 」

5
nelaaro

これを行うsystemdの方法は、ソケットを開く、または notification (または終了する親スクリプト)を送信するなど、何らかの方法でセットアップされたときにプロセスに「トークバック」させることです。これはもちろん、特にサードパーティのものでは必ずしも簡単ではありません:|

インラインで何かできるかもしれません

ExecStart=/bin/bash -c '/bin/start_cassandra &; do_bash_loop_waiting_for_it_to_come_up_here'

または同じことを行うスクリプト。または、do_bash_loop_waiting_for_it_to_come_up_hereをExecStartPostに入れます

または、ヘルパーサービスが作成されるのを待つヘルパー.serviceを作成して、ヘルパーサービスがcassandraに依存し、それが起動するのを待つと、他のプロセスがヘルパーサービスに依存するようになります。

(同様に、デフォルトの90から TimeoutStartSec を増やしたい場合があります)

1
rogerdpack