特定条件下阻止systemctl停止服务:ExecStop脚本无效问题咨询
解决systemd服务ExecStop返回错误码仍被强制终止的问题
问题原因
systemd默认行为是:无论ExecStop脚本返回什么退出码,都会向服务主进程发送终止信号(如SIGTERM),因此即使你的脚本返回错误码,服务仍会被强制杀死。
解决方案
1. 修正脚本语法错误
你的脚本存在语法问题,if语句缺少; then,会导致执行失败。修正后的脚本如下:
#!/usr/bin/env bash # Version: 1.0.0 ## RUN SCRIPT ## # 获取活跃连接数 show_con if [ "${connectionsCount}" -gt 0 ]; then exit 1 else stop_service fi
2. 修改systemd服务配置
在[Service]段添加KillMode=none,禁止systemd主动终止主进程,完全由ExecStop脚本控制停止逻辑。修改后的配置:
[Service] Type=simple User=root ExecStop=/bin/bash /opt/service.stop KillMode=none
3. 生效配置
执行以下命令重新加载systemd配置并重启服务:
systemctl daemon-reload systemctl restart your-service-name
效果说明
执行systemctl stop your-service-name时:
- 若活跃连接数大于0,脚本返回1,systemd不会执行任何终止操作,服务继续运行;
- 若活跃连接数为0,脚本执行
stop_service函数停止服务,服务正常终止。
内容的提问来源于stack exchange,提问作者MAGaddress
相关产品推荐
相关产品推荐

