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

lyn*_*nix 9 services systemd

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

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

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

我的目标是确保这两项服务确实运行,因此b.service如果正在运行,则应延迟a.service,反之亦然。

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

Type=oneshot据我了解,一种解决方案是和的组合,因为 oneshot 使 systemd在主进程终止后After=认为单元处于活动状态(并立即死亡)。另一方面,Type=oneshot对于可能长时间运行的任务,明确不鼓励使用。

人们还可以.service使用以下方法将这两项任务放在一个单元中

ExecStart=/usr/bin/sh -c 'first-command; second-command'
Run Code Online (Sandbox Code Playgroud)

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

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