(systemd版本229)
我有一个主要服务A和一个辅助服务B.主要A可以自己运行。但是服务B本身无法正常运行:它需要A运行(技术上B 可以运行,但这是我想要systemd
阻止的)。我的目标:如果A未运行,则B不应运行。鉴于A和B正在运行,当A停止或死亡/崩溃时,应停止B。
我如何实现这一目标?
我通过使用
将[Unit]项目添加到b.service来接近Requisite=A.service
After=A.service
以上结果是
如何解决这最后的行为? PartOf
和BindsTo
似乎都没有做到这一点,但也许我没有选择组合的正确咒语?从手册页中我不清楚哪些选项可以合并。
systemd.unit手册页:https://www.freedesktop.org/software/systemd/man/systemd.unit.html 相关:Systemctl dependency failure, stop dependent services
答案 0 :(得分:1)
如果您使用Type=notify
启动服务A,如果您使用SIGINT
或SIGTERM
终止服务A,则可以实现某些目标,您实际上可以处理并在{{ 1}}到$NOTIFY_FD
,但是systemd
仍然无法使用该选项。它涉及到一些,但可能能够实现您想要的。
您还应该考虑制作A SIGKILL
。这将至少确保A将保持可用状态,而B将不会继续发出错误。当您Restart=always
A(在kill
之外)时,systemd
无法知道A被杀死了-尤其是如果您使用systemd
(kill -9
无法处理)。 。因此,处理此问题的最佳方法之一就是使服务A SIGKILL
。
答案 1 :(得分:0)
要实现您的第三个目标,请使用PartOf
关键字。
在B.service中,您需要在[Unit]
部分下添加对A的依赖,如下所示
[Unit]
..
..
PartOf=A.service
有了这个,每当A被杀,B也会停止。