如何在serviceA.service启动失败后停止systemd的serviceB.service
解决serviceA启动失败时停止serviceB的方案
问题分析
你之前尝试的Requires=、After=、BindTo=都是启动阶段的依赖控制,仅在服务启动过程中生效:
Requires=serviceA仅会在serviceB启动时,因serviceA启动失败而阻止serviceB启动,无法在serviceA后续启动失败时停止已运行的serviceB;BindTo=serviceA仅在serviceA被主动停止(从active转为inactive)时终止serviceB,对serviceA直接进入failed状态的场景无效;- 之前的
OnFailure=可能因配置方式错误,未正确触发停止serviceB的操作。
由于serviceB是forking类型且无法修改,我们可以通过serviceA失败时触发自定义停止操作来实现需求。
具体实现步骤
1. 创建停止serviceB的辅助服务
在/etc/systemd/system/目录下新建stop-serviceB.service文件,内容如下:
[Unit] Description=Stop serviceB when serviceA fails [Service] Type=oneshot # 使用try-stop避免serviceB已停止时返回错误 ExecStart=/usr/bin/systemctl try-stop serviceB.service
2. 配置serviceA的失败触发动作
修改/etc/systemd/system/serviceA.service,在[Service]段添加OnFailure指令:
[Service] # 保留原有配置... OnFailure=stop-serviceB.service
3. 生效配置并测试
执行以下命令重新加载systemd配置:
sudo systemctl daemon-reload
之后启动serviceA,若其启动失败,即可观察到serviceB被自动停止。
补充说明
try-stop与stop的区别:try-stop会忽略服务未运行的情况,不会因serviceB已停止而导致辅助服务执行失败;- 若需要同时处理serviceA运行中意外失败的场景,可在serviceA中额外配置
Restart=on-failure,配合OnFailure确保任何失败场景都能触发停止serviceB。
内容的提问来源于stack exchange,提问作者pranay
相关产品推荐
相关产品推荐

