
我正在使用一些模板化計時器單元來運行一組模板化服務。有些備份作業和關聯的維護任務需要備份儲存庫上的獨佔鎖,並且不能與備份作業同時運作。我正在嘗試弄清楚如何設定這些單元,以便正確排序作業。
例如,我有以下服務範本:
我有以下計時器模板:
[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 天的快照。順便說一句,這兩項服務都是.backup
clean
clean
clean
backup
Type=oneshot
我還考慮過進行單一的備份和清理工作,這也可以以類似的方式運作。
缺點是我無法在不啟動備份的情況下運行乾淨的作業,儘管這不是一個實際問題。