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)命令来确保维护作业在备份作业完成后才启动。

这可行,但有点不靠谱。如果有更好的方法使用 systemd 来解决这个问题,我很乐意找到答案。

答案1

经过一番思考,这个问题有一个明显的答案:在[email protected]模板中,添加对相应实例的依赖[email protected],如下所示:

[Unit]
After=backup@%i.service

只要服务并行启动,这种方法就没问题。我现在不知道具有相同OnCalendar设置的服务是否并行启动;一旦我弄清楚了,我会更新这个答案。

答案2

Requires我通过将添加backup到作业上来解决了类似的问题clean。我的计时器每 6 小时运行一次clean作业 - 由于依赖性,clean作业会启动backup,并且当备份完成时,它会清除超过 60 天的所有快照。顺便说一句,这两项服务都是Type=oneshot

我还考虑进行一次单独的备份和清理工作,其工作方式也类似。

缺点是,如果不启动备份,我就无法运行干净的作业,尽管这不是一个实际问题。

相关内容