我有两个 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'
但我认为这非常丑陋,因为它会将两种服务的执行间隔绑定在一起。
那么,让多个服务依赖于同一独有资源的最系统化的方式是什么?