抽象的な例:
サービスに設定したいA
2つの反復操作があります。タスクは互いに非常に似ているため、テンプレートを使用してください。 AとBはそれぞれこのテンプレートのインスタンスとして実行されます。B
systemd
[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.timer
2つのタイマーで処理する必要があります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
し、開始する前に完了する必要がある場合についてのみ議論しています。B
A
B
答え1
テンプレートインスタンスを使用しているため、
Before=
サービス自体のオプションを使用できません。After=
ただし、テンプレートの特定のインスタンスに対してこれを設定できます。しかし、どのような関係が円満になるために気づく:
最も重要なのは、サービスユニットの場合、設定されたすべての
Before=
起動After=
コマンドが呼び出され、そのコマンドが失敗したか成功した起動を報告すると、起動が完了したと見なされることです。
つまり、注文が完了する[email protected]
とExecStart
スタート実装する。完了するまで待ちません。ただし、ExecStartPre
コマンドでこれらのユニットの実際の操作を実行し、単純な/bin/true
forを使用すると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
だから。