![仅当另一个服务运行没有错误时,systemd 才启动一个服务](https://linux22.com/image/9806/%E4%BB%85%E5%BD%93%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%9C%8D%E5%8A%A1%E8%BF%90%E8%A1%8C%E6%B2%A1%E6%9C%89%E9%94%99%E8%AF%AF%E6%97%B6%EF%BC%8Csystemd%20%E6%89%8D%E5%90%AF%E5%8A%A8%E4%B8%80%E4%B8%AA%E6%9C%8D%E5%8A%A1.png)
如何仅在另一个服务单元运行没有任何错误的情况下启动一个服务单元?
我有2个服务单位:
#echo-date-0.service
[Unit]
Description=
[Service]
ExecStart=/home/user/bash/echo-date-0.sh
[Install]
WantedBy=multi-user.target
#echo-date-1.service
[Unit]
Description=
[Service]
ExecStart=/home/user/bash/echo-date-1.sh
Requires=echo-date-0.service
After=echo-date-0.service
[Install]
WantedBy=multi-user.target
我的脚本 echo-date-0.sh 返回退出代码 1(退出 1),如果我检查 echo-date-0.service 的状态,我会看到:
Active: failed (Result:exit-code)
Process: (code=exited, status=1/FAILURE)
但是,即使我需要 echo-date-0.service,echo-date-1.service 也会运行。如果 echo-date-0.service 失败,如何停止 echo-date-1.service 运行?
答案1
#echo-date-0.service
[Unit]
Description=
[Service]
Type=oneshot
## Stay alive for other services to acknowledge
RemainAfterExit=yes
ExecStart=/home/user/bash/echo-date-0.sh
[Install]
WantedBy=multi-user.target
#echo-date-1.service
[Unit]
Description=
Requires=echo-date-0.service
After=echo-date-0.service
## A unit that must be in an active non-erroring state
## and combos great with After=
BindsTo=echo-date-0.service
[Service]
ExecStart=/home/user/bash/echo-date-1.sh
[Install]
WantedBy=multi-user.target
杰西_b至少对我来说,BindsTo=
在UNIX系统会有用的。
和比贡正确地指出该[Unit]
部分应该有Requires=
& After=
。
实际上echo-date-0.service
,在上面的(希望能发挥作用的)示例中,仍然是活作为服务(因此systemctl stop echo-date-0.service
需要运行来重置状态),但是通过这样设置并组合After=
&BindsTo=
来echo-date-1.service
指向不能出错的服务,这应该实现OP在这里所要求的。
在这种情况下,人们应该能够继续运行systemctl list-dependencies --before <service/trigger>
,echo-date-0.service
以查看以一种或另一种形式链接到它的服务。
答案2
Requires=
并且After=
需要在该[Unit]
部分中