
テンプレート化されたタイマー ユニットを使用して、テンプレート化された一連のサービスを実行しています。バックアップ リポジトリの排他ロックを必要とし、バックアップ ジョブと同時に実行できないバックアップ ジョブと関連するメンテナンス タスクがあります。ジョブが正しく順序付けされるようにユニットを設定する方法を見つけようとしています。
たとえば、次のサービス テンプレートがあります。
次のタイマー テンプレートがあります。
[email protected]
ユニットが対応するインスタンスを開始する場所[email protected]
は次のようになります。
[Unit]
Description=daily backup of %i
[Timer]
OnCalendar=daily
Unit=backup@%i.service
[Install]
WantedBy=timers.target
走ったら…
systemctl enable --now [email protected] [email protected]
...backup@foo サービスが完了するまで clean@foo サービスが実行されないようにする必要があります。
これまでのところ私が思いついた唯一の解決策は、OnCalendar=daily
バックアップジョブを確実に実行できるように、明示的な開始時間を使用することです。始めるまず(たとえば、バックアップ ジョブを午前 1 時に開始し、メンテナンス ジョブを午前 2 時に開始する)、次に何らかのロックflock
コマンド(たとえば、)を使用して、バックアップ ジョブが完了するまでメンテナンス ジョブが開始されないようにします。
それは機能しますが、少しハッキーです。systemd を使用してこれを解決するより良い方法があれば、それを理解したいと思います。
答え1
この質問を少し考えてみると、答えは明らかです。テンプレートで、次のように[email protected]
対応するインスタンスへの依存関係を追加します。[email protected]
[Unit]
After=backup@%i.service
これは、サービスが並行して開始されている限り正常に機能します。同じOnCalendar
設定のサービスが並行して開始されるかどうかは現時点ではわかりません。それがわかったら、この回答を更新します。
答え2
Requires
私は、ジョブbackup
に を配置することで同様の問題を解決しましたclean
。私のタイマーはclean
6 時間ごとにジョブを実行します。依存関係により、clean
ジョブは を開始しbackup
、バックアップが完了すると、60 日以上経過したスナップショットをすべて消去します。ちなみに、両方のサービスは ですType=oneshot
。
また、単一のバックアップとクリーンアップのジョブを実行することも検討しましたが、これも同様に機能するはずです。
欠点は、バックアップを開始せずにクリーンジョブを実行できないことですが、これは実際の問題ではありません。