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

时间:2017-11-12 19:30:49

标签: linux service systemd systemctl

(systemd版本229)

我有一个主要服务A和一个辅助服务B.主要A可以自己运行。但是服务B本身无法正常运行:它需要A运行(技术上B 可以运行,但这是我想要systemd阻止的)。我的目标:如果A未运行,则B不应运行。鉴于A和B正在运行,当A停止或死亡/崩溃时,应停止B。

我如何实现这一目标?

我通过使用

将[Unit]项目添加到b.service来接近
Requisite=A.service
After=A.service

以上结果是

    除非A正在运行(好),否则
  • B不会启动。
  • B停止时停止(良好)。
  • 但是,如果我杀了A,服务B继续运行(坏)。

如何解决这最后的行为? PartOfBindsTo似乎都没有做到这一点,但也许我没有选择组合的正确咒语?从手册页中我不清楚哪些选项可以合并。

systemd.unit手册页:https://www.freedesktop.org/software/systemd/man/systemd.unit.html 相关:Systemctl dependency failure, stop dependent services

2 个答案:

答案 0 :(得分:1)

如果您使用Type=notify启动服务A,如果您使用SIGINTSIGTERM终止服务A,则可以实现某些目标,您实际上可以处理并在{{ 1}}到$NOTIFY_FD,但是systemd仍然无法使用该选项。它涉及到一些,但可能能够实现您想要的。

您还应该考虑制作A SIGKILL。这将至少确保A将保持可用状态,而B将不会继续发出错误。当您Restart=always A(在kill之外)时,systemd无法知道A被杀死了-尤其是如果您使用systemdkill -9无法处理)。 。因此,处理此问题的最佳方法之一就是使服务A SIGKILL

答案 1 :(得分:0)

要实现您的第三个目标,请使用PartOf关键字。

在B.service中,您需要在[Unit]部分下添加对A的依赖,如下所示

[Unit]
..
..
PartOf=A.service

有了这个,每当A被杀,B也会停止。