2

我有 2 项服务 a.service 和 b.service。a. 显示服务

[Unit]
Description=My service

[Service]
Type=forking
ExecStart=/bin/sh /home/admin/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target,

b.服务

[Unit]
Description=My service

[Service]
Type=forking
ExecStart=/bin/sh $HOME/theFolder/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

现在,当我启动 b.service 时,我确定 a.service 会启动。在运行时,突然有人弄乱了 /home/admin/run.sh 并且 systemd 无法启动 a.service (也 systemctl status a.service 显示失败作为状态)。现在有一个选项可以让 b.service 知道 a.service 失败并且应该停止/退出?

4

1 回答 1

3

您想要添加BindsTo=或添加Requires=到您的[Unit]部分,如man systemd.unit

需要= 配置对其他单元的需求依赖。如果这个单位被激活,这里列出的单位也将被激活。如果其他单位之一被停用或其激活失败,则该单位将被停用。可以多次指定此选项,或者可以在一个选项中指定多个空格分隔的单元,在这种情况下,将为所有列出的名称创建需求依赖关系。请注意,需求依赖性不会影响服务启动或停止的顺序。这必须使用 After= 或 Before= 选项独立配置。如果单元 foo.service 需要使用 Requires= 配置的单元 bar.service 并且没有使用 After= 或 Before= 配置排序,如果 foo.service 被激活,那么两个单元将同时启动并且它们之间没有任何延迟。通常,使用 Wants= 而不是 Requires= 是更好的选择,以便在处理失败的服务时实现更健壮的系统。

BindsTo= 配置需求依赖,在风格上与 Requires= 非常相似,但是除了这个行为之外,它还声明当列出的任何单元突然消失时,该单元将停止。如果服务自行终止、设备被拔出或挂载点在没有 systemd 参与的情况下被卸载,则单元可能会突然、意外地消失。

于 2017-03-10T14:34:52.273 回答