systemdテンプレートインスタンス間の順序依存関係の管理

systemdテンプレートインスタンス間の順序依存関係の管理

抽象的な例:

サービスに設定したいA2つの反復操作があります。タスクは互いに非常に似ているため、テンプレートを使用してください。 AとBはそれぞれこのテンプレートのインスタンスとして実行されます。Bsystemd[email protected][email protected][email protected]

# [email protected]
[Unit]
Description= myservice %I

[Service]
Type=oneshot
IOSchedulingClass=idle
ExecStart=bash -c "echo Starting %I; sleep 10; echo Finished %I"
Restart=on-failure

これら2つの操作の繰り返し要件は、myservice-A.timer2つのタイマーで処理する必要がありますmyservice-B.timer。タイマーは、A毎週やB毎日など、設定された間隔に応じて2つの操作を繰り返すことができます。タイマーはPCの電源が切れている場合でもこれを保証し、事前設定された再起動がタイムアウトしたときにできるだけ早くサービスを開始します。

Aただし、この最後のケースは、完了する必要がある前の要件と競合する可能性がありますB(2つが同時に開始された場合)。テンプレートインスタンスを使用しているため、Before=サービス自体でオプションを使用できません。After=タイマーに追加できますが、問題は解決しないようです(おそらく、タイマーは開始サービスではなくソート依存関係のみを取得するためです)。

# myservice-A.timer
[Unit]
# The Before= requirement below does not help
Before=myservice-B.timer
Description=weekly execution of myservice

[Timer]
OnCalendar=Monday *-*-* 09:20:00
Persistent=true
[email protected]

[Install]
WantedBy=timers.target
# myservice-B.timer
[Unit]
# the After= requirement below does not help
After=myservice-A.timer
Description=daily execution of myservice

[Timer]
OnCalendar=09:30:00
Persistent=true
[email protected]

[Install]
WantedBy=timers.target

B実行は不要です。つまりA、そのタイプの依存関係を探していませんRequires=。私は両方ともタイマーを介して起動Aし、開始する前に完了する必要がある場合についてのみ議論しています。BAB

答え1

テンプレートインスタンスを使用しているため、Before=サービス自体のオプションを使用できません。After=

ただし、テンプレートの特定のインスタンスに対してこれを設定できます。しかし、どのような関係が円満になるために気づく:

最も重要なのは、サービスユニットの場合、設定されたすべてのBefore=起動After=コマンドが呼び出され、そのコマンドが失敗したか成功した起動を報告すると、起動が完了したと見なされることです。

つまり、注文が完了する[email protected]ExecStartスタート実装する。完了するまで待ちません。ただし、ExecStartPreコマンドでこれらのユニットの実際の操作を実行し、単純な/bin/trueforを使用するとExecStartソートが機能します。たぶん、次のようなものがあります。

# [email protected]
[Unit]
Description= myservice %I
[email protected]  # Will be skipped for `myservice@A` itself

[Service]
Type=oneshot
IOSchedulingClass=idle
ExecStartPre=/bin/bash -c "echo Starting %I; sleep 10; echo Finished %I"
ExecStart=/bin/true
Restart=on-failure

コマンドの実行に時間がかかる場合は、セットを構成する必要があります。TimeoutStartSecだから。

関連情報