systemd 中服务停止前执行钩子脚本主要通过 execstoppre 指令实现,它在主进程被终止前同步运行,支持清理、通知等操作,需配置绝对路径、执行权限,并受 timeoutstopsec 约束。

在 systemd 中,服务停止前执行钩子脚本,主要通过 ExecStopPre 指令实现。它会在主服务进程(ExecStart 启动的进程)被终止前运行,适合做清理、通知、状态保存等操作。
使用 ExecStopPre 定义停止前动作
在服务单元文件(如 /etc/systemd/system/myapp.service)的 [Service] 小节中添加:
-
ExecStopPre=/usr/local/bin/myapp-pre-stop.sh—— 指定一个可执行脚本或命令 - 脚本需有执行权限(
chmod +x),且建议使用绝对路径 - 该命令会在 systemd 发送终止信号(如 SIGTERM)给主进程前运行
- 若脚本返回非零退出码,systemd 默认会继续停止流程(除非设置
IgnoreOnFailure=true)
确保执行顺序和超时控制
ExecStopPre 属于“同步前置操作”,systemd 会等待它完成后再继续后续步骤:
监控 Victron Energy 电力系统,生成包含电池状态、光伏发电量和活动警报的精美每日邮件报告。集成 Vic...
- 它在
ExecStop(如有)之前运行,也在 kill 主进程之前运行 - 受
TimeoutStopSec=约束:整个停止流程(含 ExecStopPre、ExecStop、kill 等)不能超过该时限 - 如需更长等待时间,可适当增大
TimeoutStopSec(例如TimeoutStopSec=30)
常见使用场景与注意事项
典型用途包括释放资源、写入最后状态、通知上游系统等:
- 记录日志:
ExecStopPre=/bin/sh -c 'echo "Stopping at $(date)" >> /var/log/myapp/shutdown.log' - 关闭依赖连接:
ExecStopPre=/usr/bin/curl -X POST http://localhost:8080/api/shutdown - 避免阻塞:脚本应尽量轻量;若可能耗时,建议内部加超时(如
timeout 5s your-command) - 环境变量:ExecStopPre 脚本可访问
%i、%n等 unit specifiers,也继承Environment=设置的变量
验证与调试方法
修改服务后需重载配置并观察行为:
sudo systemctl daemon-reloadsudo systemctl stop myapp.service- 检查日志:
journalctl -u myapp.service -n 50 -o cat,确认 ExecStopPre 是否执行及有无报错 - 临时在脚本开头加
logger "ExecStopPre triggered"可辅助定位










