如何从一项服务同步 systemd 停止命令?

如何从一项服务同步 systemd 停止命令?

假设我有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.servicea.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

相关内容