Systemd:如何使两个服务互斥但同时运行?

Systemd:如何使两个服务互斥但同时运行?

我有两个 systemd 计时器及其相关服务:

  • a.timer触发a.service
  • b.timer触发b.service

两种服务都使用系统包管理器执行管理任务,因此它们不得并行运行(事实上​​,如果其中一个服务在启动时另一个服务正在运行,则两个服务都会失败,因为它们都会尝试创建一个锁文件)。

我的目标是确保两项服务都能运行,因此b.service如果正在运行就会延迟a.service,反之亦然。

如果我理解systemd.unit(5)我不能正确使用Conflicts=,因为这会在启动另一项服务时主动停止一项服务。我不能使用After=Before=(与Type=simple)因为这只会延迟第二项服务,直到第一项服务启动初始化(即仍在运行)。

据我理解,一个解决方案是将Type=oneshot和结合起来,After=因为oneshot 使 systemd 考虑该单元积极的(并立即死的) 在主进程终止后。另一方面,Type=oneshot对于可能长时间运行的任务,明确不建议使用。

也可以将两个任务放在一个.service单元中,使用

ExecStart=/usr/bin/sh -c 'first-command; second-command'

但我认为这非常丑陋,因为它会将两种服务的执行间隔绑定在一起。

那么,让多个服务依赖于同一独有资源的最系统化的方式是什么?

相关内容