systemd:设置模板化计时器单元之间的依赖关系?

lar*_*sks 6 systemd

我正在使用一些模板化计时器单元来运行一组模板化服务。有些备份作业和关联的维护任务需要备份存储库上的独占锁,并且不能与备份作业同时运行。我正在尝试弄清楚如何设置这些单元,以便正确排序作业。

例如,我有以下服务模板:

  • backup@.service
  • clean@.service

我有以下计时器模板:

  • backup-daily@.timer
  • backup-weekly@.timer
  • clean-daily@.timer
  • clean-weekly@.timer

单元backup-daily@.timer启动相应backup@.service实例的位置可能类似于:

[Unit]
Description=daily backup of %i

[Timer]
OnCalendar=daily
Unit=backup@%i.service

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

如果我跑...

systemctl enable --now backup-daily@foo.timer clean-daily@foo.timer
Run Code Online (Sandbox Code Playgroud)

...我需要确保 clean@foo 服务在 backup@foo 服务完成之前不会运行。

到目前为止,我想出的唯一解决方案是放弃OnCalendar=daily并使用显式启动时间,以便我可以保证备份作业首先启动(例如,在凌晨 1 点启动备份作业,在凌晨 2 点启动维护作业),然后利用某种锁定(例如,flock)命令可确保维护作业在备份作业完成后才开始。

这可行,但有点hacky。如果有更好的方法使用 systemd 来解决这个问题,我想弄清楚。

lar*_*sks 1

经过一番思考后,有一个明显的答案:在clean@.service模板中,添加对相应backup@.service实例的依赖项,如下所示:

[Unit]
After=backup@%i.service
Run Code Online (Sandbox Code Playgroud)

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