我正在使用一些模板化计时器单元来运行模板化服务集。有些备份作业和相关维护任务需要对备份存储库进行独占锁定,并且不能与备份作业同时运行。我正在尝试弄清楚如何设置这些单元,以便正确对作业进行排序。
例如我有以下服务模板:
我有以下计时器模板:
该[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
)命令来确保维护作业在备份作业完成后才启动。
这可行,但有点不靠谱。如果有更好的方法使用 systemd 来解决这个问题,我很乐意找到答案。
答案1
经过一番思考,这个问题有一个明显的答案:在[email protected]
模板中,添加对相应实例的依赖[email protected]
,如下所示:
[Unit]
After=backup@%i.service
只要服务并行启动,这种方法就没问题。我现在不知道具有相同OnCalendar
设置的服务是否并行启动;一旦我弄清楚了,我会更新这个答案。
答案2
Requires
我通过将添加backup
到作业上来解决了类似的问题clean
。我的计时器每 6 小时运行一次clean
作业 - 由于依赖性,clean
作业会启动backup
,并且当备份完成时,它会清除超过 60 天的所有快照。顺便说一句,这两项服务都是Type=oneshot
。
我还考虑进行一次单独的备份和清理工作,其工作方式也类似。
缺点是,如果不启动备份,我就无法运行干净的作业,尽管这不是一个实际问题。