假设我有a.service
不能修改的和b.service
可以修改的,我想看到这个停止订单:
Stopping b.service ...
Stopped b.service
Stopping a.service ...
Stopped a.service
而不是这个:
Stopping b.service ...
Stopping a.service ...
Stopped b.service
Stopped a.service
假设这b.service
可能至少需要 20 秒才能完成。
答案1
为了提前停止b.service
,a.service
您需要实际订购b.service
后 a.service
,因为服务停止时的顺序与开始时的顺序相反。
所以这应该足以完成您所描述的内容:
# b.服务单元文件 [单元] 描述=... After=a.service [服务] ...
请参阅After=
的文档man systemd.unit
,其中指出:
请注意,当两个具有顺序依赖性的单元被关闭时,将应用启动顺序的相反顺序。即,如果一个单元在另一个单元上配置
After=
,则如果两个单元都关闭,则前者会先于后者停止。
您还询问如果b.service
至少需要 20 秒才能终止会发生什么。没事儿。如果b.service
配置正确,则 systemd 能够监视它,直到单元停止完成(换句话说,如果ExecStop=
没有以某种方式配置错误),并且它是否在达到超时之前停止(请参阅TimeoutStopSec=
),然后 systemd 将等到b.service
完全停止后再初始化 的关闭a.service
。
答案2
systemctl
如果您只想按给定顺序停止这些操作,您可以像这样调用:
$ systemctl stop a.service && systemctl stop b.service
或者
$ systemctl stop a.service; systemctl stop b.service