我有两个 systemd 服务A
(需要几分钟)和B
(只需很少几秒钟):
A
具有高优先级并且必须在所有情况下运行。B
运行时无法启动,但仍然运行时A
启动没有问题。甚至希望在仍在运行时启动,因为在所有情况下都必须运行。A
B
A
B
A
B
Conflicts=
停止服务时不应该被杀死,相反它仍然应该完成运行。
这系统人告诉我:
配置负面需求依赖性。如果一个单元在另一个单元上有 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 如何解释/命名进程退出代码。
换行也是可选的,您可以简单地将所有内容写在一行中,只需省略\
用于换行的尾随即可。