systemd:主服务崩溃时停止依赖服务

5

(systemd 229版本)

我有一个主要服务A和一个次要服务B。主服务A可以单独运行,但是次要服务B无法正确地单独运行(从技术上讲,B 可以 运行,但这就是我希望systemd防止的情况)。我的目标是:如果A没有运行,B就不应该运行。当A和B正在运行时,若A停止或崩溃,则应该停止B。

我该如何实现这一目标?

通过将[Unit]项添加到b.service中,我可以接近目标,使用:

Requisite=A.service
After=A.service

以上的结果是:
  • 只有在A运行时,B才会启动(好)。
  • 当A停止时,B也会停止(好)。
  • 然而,如果我杀死A,服务B仍然会继续运行(不好)。
如何解决这个问题?无论是 PartOf 还是 BindsTo 都似乎行不通,但也许我没有正确地组合选项?从手册页上看不出哪些选项可以组合。
systemd.unit 手册页:https://www.freedesktop.org/software/systemd/man/systemd.unit.html 相关链接:Systemctl dependency failure, stop dependent services

Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。 - jww
真的吗?在SO上已经有很多关于systemd的问题得到了解答。它与系统开发有关,不仅仅是应用程序的开发。 - Jesús Franco
你试过使用像链接问题中提出的BindsTo作为解决方案而不是Requisite吗? - Jesús Franco
谢谢,我会把这个问题移动到S/E。@Jesus,BindsTo处理了kill B部分,但它有一个副作用,就是当我启动B时,A也会被启动。我希望B像Requisite一样给出依赖错误。但我想BindsTo是两者中更好的选择。谢谢你建议我再次查看它。 - Uncle Spook
1
已转至ServerFault:https://serverfault.com/questions/884211/systemd-service-dependency-if-a-is-not-running-b-should-not-run - Uncle Spook
3个回答

2
您可以使用 Requires=PartOf=BindTo=
详细了解它们的用法,请参见此文章

1
为了达成你的第三个目标,请使用PartOf关键字。
在B服务中,您需要在[Unit]部分下添加对A的依赖关系,如下所示。
[Unit]
..
..
PartOf=A.service

每当A被杀时,B也会停止。

谢谢@DarkKnight,但PartOf并不能完全解决问题;如果我正常停止A,那么B也会停止(好的),但是如果A死亡或被杀死,B将继续运行(不好)。使用BindsTo似乎更接近解决方案,但它有一个不同的问题。无论如何,对于参考,我已经将这个问题移动到ServerFault。 - Uncle Spook

1
如果您使用Type=notify启动服务A,当您用SIGINTSIGTERM终止A时,您可以在$NOTIFY_FD上发送消息到systemd,但这个选项在使用SIGKILL时仍然不可行。这有点复杂,但可能能够实现您想要的效果。
您还应该考虑将A设置为Restart=always。这至少可以确保A保持可用性,并且B不会继续显示错误。当您在systemd之外使用kill终止A时,systemd无法知道A已被终止,特别是如果您使用kill -9(SIGKILL不能被处理)。因此,处理这个问题的最佳方式之一是将Service A设置为Restart=always

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接