使用 trap 命令捕获信号(如 int、term)和 exit/err 事件,绑定 cleanup 或错误处理函数,确保脚本异常退出时执行幂等恢复动作,其中 exit 陷阱是兜底保障。

在 Linux Shell 脚本中,让脚本在异常退出(比如被中断、出错、或非零状态退出)时自动执行恢复动作,核心方法是使用 trap 命令捕获信号和退出事件,并绑定清理或恢复逻辑。
用 trap 捕获关键退出信号
脚本可能因用户按 Ctrl+C(SIGINT)、收到终止请求(SIGTERM)、被 kill -15、或子进程出错而意外中断。你可以为这些信号注册处理函数:
- trap 'cleanup' INT TERM —— 当脚本收到 Ctrl+C 或 kill -15 时,执行 cleanup 函数
- trap 'echo "Script interrupted"; exit 1' USR1 —— 自定义信号也可用于外部触发恢复流程
- 注意:SIGKILL(kill -9)无法被捕获,这是内核强制终止,任何 trap 都无效
确保无论怎么退出都执行恢复动作
最可靠的方式是设置 EXIT 陷阱,它会在脚本以任意方式结束(包括正常 exit、错误退出、或被信号终止后)时触发:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- trap 'rm -f /tmp/mylock /tmp/data.tmp; echo "Cleanup done."' EXIT
- 这个动作会运行一次,且一定在脚本生命周期最后执行,适合释放临时文件、解锁资源、关闭连接等
- 推荐始终搭配 EXIT 使用,它是兜底保障
结合错误状态做条件恢复
如果脚本某条命令失败(返回非零值),你还可以用 set -e + ERR trap 实现更精细控制:
- set -e 让脚本在任一命令失败时立即退出
- trap 'handle_error $?' ERR 可捕获上一条命令的退出码,做针对性恢复(如回滚上一步操作、发送告警)
- 例如:若数据库导入失败,可自动还原上一个备份快照
实际恢复动作建议
恢复动作应轻量、幂等、避免依赖外部服务:
- 删除临时文件、释放锁文件(rm -f /tmp/script.lock)
- 重置环境变量或配置文件([ -f /tmp/orig.conf ] && cp /tmp/orig.conf /etc/app.conf)
- 发送本地日志或写入状态标记(echo "FAILED $(date)" >> /var/log/myscript.log)
- 避免在 trap 中启动长时间服务或调用网络 API,以防阻塞退出










