systemd:設定模板化計時器單元之間的依賴關係?

systemd:設定模板化計時器單元之間的依賴關係?

我正在使用一些模板化計時器單元來運行一組模板化服務。有些備份作業和關聯的維護任務需要備份儲存庫上的獨佔鎖,並且不能與備份作業同時運作。我正在嘗試弄清楚如何設定這些單元,以便正確排序作業。

例如,我有以下服務範本:

我有以下計時器模板:

[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]

....我需要確保 clean@foo 服務在 backup@foo 服務完成之前不會運行。

到目前為止,我想出的唯一解決方案是放棄OnCalendar=daily並使用顯式開始時間,以便我可以保證備份作業開始首先(例如,在凌晨 1 點啟動備份作業,在凌晨 2 點啟動維護作業),然後利用某種鎖定(例如,flock)指令來確保維護作業在備份作業完成之前不會啟動。

這可行,但有點hacky。如果有更好的方法使用 systemd 來解決這個問題,我想弄清楚。

答案1

經過一番思考後,有一個明顯的答案:在模板中[email protected],加入對應[email protected]實例的依賴項,如下所示:

[Unit]
After=backup@%i.service

只要服務並行啟動,這種方法就可以正常運作。我現在不知道具有相同OnCalendar設定的服務是否並行啟動;一旦我弄清楚了這個答案,我就會更新這個答案。

答案2

我透過將工作放在工作上Requires解決了類似的問題。我的計時器每 6 小時執行一次作業 - 由於依賴性,作業會啟動,當備份完成時,它會清除所有超過 60 天的快照。順便說一句,這兩項服務都是.backupcleancleancleanbackupType=oneshot

我還考慮過進行單一的備份和清理工作,這也可以以類似的方式運作。

缺點是我無法在不啟動備份的情況下運行乾淨的作業,儘管這不是一個實際問題。

相關內容