如何在 systemd 中仅在一个方向上设置冲突

如何在 systemd 中仅在一个方向上设置冲突

我有两个 systemd 服务A(需要几分钟)和B(只需很少几秒钟):

  • A具有高优先级并且必须在所有情况下运行。
  • B运行时无法启动,但仍然运行时A启动没有问题。甚至希望在仍在运行时启动,因为在所有情况下都必须运行。ABABA
  • BConflicts=停止服务时不应该被杀死,相反它仍然应该完成运行。

系统人告诉我:

配置负面需求依赖性。如果一个单元在另一个单元上有 Conflicts= 设置,则启动前者将停止后者反之亦然

我认为使用Conflicts=A.service可能是解决方案。男人告诉我,开始A就会停止B,但我不想要的是B停止A

有没有办法Conflicts=只有单向?

答案1

Conflict=指令并不是您真正想要的,不仅因为它在两个方向上工作,而且因为您不想B.service在启动时停止当前正在运行的(如果正在运行)A.service

我建议您实现这一点的方法是添加一个额外的脚本来B.service检查是否A.service正在运行,然后防止B.service在这种情况下启动。

您可以通过添加一个具有非零状态的退出ExecStartPre=来做到这一点,这将阻止它在启动过程中进一步前进。B.service

我的建议是将这样的内容添加到您现有的中/etc/systemd/system/B.service

ExecStartPre=/bin/sh -c 'if systemctl -q is-active A.service; then \
                             echo "A.service already running, will not start B.service"; \
                             exit 75; \
                         fi'

这使用systemctl is-active检查服务A.service当前是否正在运行。

如果没有,它会回显一条消息(该消息最终会出现在日志中,更重要的是,每当您检查时都会显示该消息systemctl status B.service。)此外,它将以非零状态退出。我选择了退出代码 75,因为 systemd 将显示该代码,这EX_TEMPFAIL意味着“暂时失败;邀请用户重试”。看这里了解 systemd 如何解释/命名进程退出代码。

换行也是可选的,您可以简单地将所有内容写在一行中,只需省略\用于换行的尾随即可。

相关内容