【问题标题】:systemd: Stop dependent service when main service crashessystemd:当主服务崩溃时停止依赖服务
【发布时间】:2017-11-12 19:30:49
【问题描述】:

(系统版本 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 不会启动。
  • A 停止时 B 也停止(良好)。
  • 但是,如果我杀死 A,服务 B 会继续运行(错误)。

如何解决最后一个问题? PartOfBindsTo 似乎都不起作用,但也许我没有正确的选项组合咒语?从手册页中我不清楚可以组合哪些选项。

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

【问题讨论】:

  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地点。
  • 真的吗? SO中已经回答了很多系统问题。而且它涉及到系统的开发,不仅仅是开发应用程序。
  • 您是否尝试过使用 BindsTo 代替 Requisite,因为在链接的问题中提出了解决方案?
  • 谢谢,我会把问题移到 S/E。 @Jesus,BindsTo 处理 kill B 部分,但它具有副作用,即当我启动 B 时,A 也会启动。我希望 B 给出一个依赖错误,就像它对 Requisite 所做的那样。但我想 BindsTo 是两者中更好的选择。感谢建议我再看一遍。

标签: linux service systemd systemctl


【解决方案1】:

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

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

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

这样,每当A被杀死时,B也应该停止。

【讨论】:

  • 感谢@DarkKnight,但 PartOf 并没有完全做到;如果我正常停止 A,则 B 停止(好),但如果 A 死亡或被杀死,B 继续运行(坏)。使用 BindsTo 似乎更接近,但它有一个不同的问题。无论如何,fwiw,我已将此问题移至 ServerFault。
【解决方案2】:

如果您使用Type=notify 启动服务A,如果您使用SIGINTSIGTERM 终止A,您可能能够实现某些目标,您实际上可以处理该问题并将$NOTIFY_FD 上的消息发送到systemd,但是SIGKILL 仍然无法使用该选项。这有点涉及,但也许能够实现你想要的。

您还应该考虑制作 A Restart=always。这将至少确保 A 将保持可用并且 B 不会继续给出错误。当您kill A(在systemd 之外)时,systemd 无法知道 A 已被杀死 - 特别是如果您使用 kill -9 这样做(SIGKILL 无法处理)。 .因此,处理该问题的最佳方法之一是创建服务 A,Restart=always

【讨论】:

    【解决方案3】:

    您可以使用 Requires=PartOf=BindTo=

    查看this article了解其用法的详细信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      相关资源
      最近更新 更多