我正在尝试在systemd
单元文件中描述的两个服务之间创建依赖关系:
- a.service 必须在 b.service 之前启动
- b.service 如果 a.service 失败则无法启动
这是我所拥有的:
% cat a.service
[Unit]
Description=A-Service
Before=b.service
[Service]
ExecStart=/opt/a.sh
[Install]
WantedBy=multi-user.target
% cat b.service
[Unit]
Description=B-Service
After=a.service
[Service]
ExecStart=/opt/b.sh
[Install]
WantedBy=multi-user.target
这是为服务 A 和 B 执行的简单脚本:
% cat a.sh
#!/bin/sh
echo "A service started"
exit 0
% cat b.sh
#!/bin/sh
echo "B service started"
while [ true ]; do
sleep 1
do
exit 0
所以我试图通过exit 1
从返回来模拟/服务失败a.sh
,将systemctl status a.service
其报告为失败:
Active: failed (Result: exit-code) ...
Process: 843 ExecStart=/opt/a.sh (code=exited, status=1/FAILURE)
...
但是 b.service 仍然启动并处于活动状态:
% systemctl status b.service
...
Active: active (running) ...
Process: 844 ExecStart=/opt/b.sh (code=exited, status=0/SUCCESS)
...
此外,b.service 依赖项确实包含 a.service(状态为 Fail):
% systemctl list-dependencies b.service
...
我究竟做错了什么?是脚本有问题还是 [Unit] 定义不完整?
我会
Requires
在第二个单元中使用一个属性:我还将每个单元的类型更改为分叉,因为“简单”的默认类型将认为一旦外壳启动,单元就会启动,而分叉单元将等待外壳退出。此类型更改仅对 A-Service 至关重要。
我也
Before=b.service
从 A-Service 中删除了,因为从 B 到 A 的向后依赖(使用 B 的“After”指令)对我来说更有意义,你不必同时拥有两者。生成的单元文件是:
和: