使用一个 systemd 单元启动和停止另一个 systemd 单元

使用一个 systemd 单元启动和停止另一个 systemd 单元

我有两个服务 A.service 和 B.service。我希望当 A 退出/被终止/停止时,B 也停止。此外,我希望当 A 重新启动时,B 也重新启动。我尝试了 如何启动和停止一个 systemd 单元与另一个 systemd 单元?并设置我的文件如下:-

A.服务

[Unit]
Description=A
Before=B.service
Requires=B.service
[Service]
ExecStart=/usr/share/A
ExecStopPost=/usr/evo/exit_handler.sh %p
Restart=always
StartLimitBurst=3
StartLimitInterval=300

B.服务

[Unit]
Description=B
BindsTo=A.service

[Service]
Type=forking
ExecStart=/usr/share/B start
ExecStop=/usr/share/B stop
StartLimitBurst=5
StartLimitInterval=10
Restart=always

当我终止 A 或执行 systemctl restart A 时,我看到 B 重新启动了。但是当 A 以状态 0 退出时,我没有看到 B 重新启动。我启用了 systemd debug loggin,我看到 A 的状态变为死亡,但没有变为自动重启

答案1

您的 B 单元正在使用BindsTo=,其目的是跟踪可能消失

你想要什么反而其中PartOf=,此服务将准确跟踪指定服务的状态。从文档

PartOf=
配置与 类似的依赖项Requires=,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,该操作将传播到此单元。请注意,这是一种单向依赖项 — 对此单元的更改不会影响列出的单元。

我认为这不会解决全部不过,你的问题。我怀疑你没有足够仔细地考虑过你的两个服务之间的实际依赖关系,在让这些单元完成它们需要做的事情之前,你需要做更多的思考(并且能够表达自己)。

答案2

在本[Unit]节中PropagatesReloadTo=ReloadPropagatedFrom=PropagatesStopTo=StopPropagatedFrom=可以用来定义这样的关系。

相关内容