一组服务之间的相互排斥

一组服务之间的相互排斥

我有一组 systemd 服务,我们称它们为A.serviceB.serviceC.serviceD.service

任何服务的执行都可能会干扰其他服务,因此我希望对它们进行调度,以便在任何给定时间只能运行这四个服务之一。

我该怎么做这是最好的方法?

详情及评论

  • 所有服务都是长期运行的Type=oneshot

  • 服务的顺序并不重要。

  • 我可以修改服务的单元文件。

  • 最佳解决方案应该适用于任意数量的服务。

  • 最佳情况下,如果服务作为计时器运行、在引导时启动以及手动启动,则该解决方案都应该有效。但仅适用于计时器的解决方案也很有趣。

  • 最佳情况下,如果 A 在 B 已经运行时启动(通过计时器或手动),那么 A 应该等到 B 完成,然后 A 应该启动。

  • 也许我可以通过将每个服务声明在其他服务之前或之后来解决问题。但我还没想出如何做到这一点。它也可能会非常混乱,并且不能很好地扩展到更多服务。

  • 也许可以通过某种方式使用“切片”和资源控制来解决问题,但我一直无法弄清楚如何解决。

  • TasksMax=1似乎不对,因为它计算的是线程,而不是服务。

  • 我不希望一个服务被另一个想要启动的服务以工作方式停止Conflicts=

  • 最佳解决方案是在单元文件中添加一个假设条目MutualExclution=my-exclution-tag,这样就只允许具有相同标签的一个单元同时运行。但我认为不存在这样的单元文件条目。

答案1

我不认为 systemd 有内置的工具来支持您所描述的非常具体的语义,但似乎您可以通过使用锁定文件轻松获得您想要的东西。对于每个服务,不要运行 ,而是/some/script/or/program将其包装在对 的调用中flock

ExecStart = /usr/bin/flock /tmp/my-exclusion-lock /some/script/or/program

如果您的任何服务正在运行,任何其他服务都会阻止尝试获取锁。当正在运行的服务退出时,它将释放锁,并且等待的服务之一将开始运行。

相关内容