4

(系统版本 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 会继续运行(坏)。

我该如何解决最后一个行为?似乎也PartOf没有BindsTo办法,但也许我没有正确的选项组合咒语?从手册页中我不清楚可以组合哪些选项。

systemd.unit 手册页:https ://www.freedesktop.org/software/systemd/man/systemd.unit.html 相关:Systemctl 依赖失败,停止依赖服务

4

3 回答 3

1

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

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

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

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

于 2017-11-19T13:32:57.573 回答
1

如果你用 or 启动服务 A,如果你用orType=notify终止 A,你可能会实现一些目标,你实际上可以处理它并将消息发送到,但该选项仍然无法使用。这有点涉及,但可能能够实现你想要的。SIGINTSIGTERM$NOTIFY_FDsystemdSIGKILL

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

于 2020-01-25T16:35:33.073 回答
0

您可以使用,Requires=PartOf=BindTo=

有关其用法的详细信息,请参阅本文

于 2021-12-23T07:56:17.640 回答