当前位置:首页>Linux>Linux进阶 | trap 命令详解:优雅处理 Ctrl+C 与脚本退出

Linux进阶 | trap 命令详解:优雅处理 Ctrl+C 与脚本退出

  • 2026-09-05 07:50:40
Linux进阶 | trap 命令详解:优雅处理 Ctrl+C 与脚本退出
在使用 Shell 脚本时,你是否遇到过这种情况:
脚本执行一半,按了 Ctrl+C 强制退出
临时文件没有删除
后台进程还在运行
资源没有释放
例如:
./backup.sh
执行过程中中断:Ctrl + C
结果:
👉 临时文件残留
👉 脚本“脏退出”
这在生产环境中是非常危险的。
这时候就需要一个“善后机制”:
trap

一、trap 是什么?

一句话理解:

trap 用于捕获信号,并在脚本退出或中断时执行指定命令。

可以理解为:给脚本加一个“退出钩子”

二、trap 基本语法

trap '执行的命令' 信号 # 
示例:
trap 'echo "脚本被中断"' INT
含义:
👉 捕获 Ctrl+C(中断信号)

三、常见信号说明

信号
含义
INT
Ctrl+C 中断
TERM
终止信号
EXIT
脚本退出
KILL
强制终止(无法捕获)

四、捕获 Ctrl+C(最常用)

示例:
#!/bin/bashtrap 'echo "检测到 Ctrl+C,正在退出..."' INTwhile true; doecho "运行中..."sleep 2done
执行后:
Ctrl + C
输出:
检测到 Ctrl+C,正在退出...
👉 自定义退出行为

五、脚本退出自动执行(重点)

最常用的是:
trap '命令' EXIT示例:#!/bin/bashtrap 'echo "脚本结束,执行清理..."' EXITecho "执行任务..."sleep 2
无论:
正常结束
Ctrl+C
出错退出
👉 都会执行清理操作

六、实战:自动删除临时文件

这是 trap 的经典场景 👇
#!/bin/bashtmp_file="/tmp/test.$"touch $tmp_filetrap "rm -f $tmp_file" EXITecho "临时文件创建:$tmp_file"sleep 10
作用:
👉 无论脚本如何退出,都会删除临时文件

七、多个信号同时处理

trap 'echo "清理资源..."' INT TERM EXIT
👉 同时捕获:

Ctrl+C

kill

脚本退出

八、忽略信号

可以忽略某些信号:
trap '' INT
👉 禁止 Ctrl+C 中断
(一般不建议使用)

九、恢复默认行为

trap - INT
👉 恢复 Ctrl+C 默认行为

十、trap + set -e(高级用法)

很多脚本会使用:
set -e
当出错时立即退出。
结合 trap:
trap 'echo "发生错误,清理中..."' EXIT
👉 即使报错退出,也能执行清理

十一、真实运维场景

场景1:部署脚本清理
trap 'rm -rf /tmp/deploy_*' EXIT
场景2:停止服务时提示
trap 'echo "服务正在停止..."' TERM
场景3:防止脏数据
trap 'rollback' EXIT
👉 回滚操作

十二、常见错误

❌ 忘记加 trap
👉 脚本异常退出,资源未释放
❌ 使用 KILL
trap 'xxx' KILL
👉 无效!
原因: KILL 信号无法捕获
❌ trap 写法错误
trap echo hello EXIT # 注意:这个是错误写法
👉 必须加引号:
trap 'echo hello' EXIT

十三、小结

trap 是 Shell 脚本中非常重要的“善后机制”。
它解决的是:

脚本异常退出时的资源清理问题

一句话总结:

trap 就是给脚本加一个“退出保险”。

📌 最后送你一个实用模板(建议收藏):
#!/bin/bashcleanup() {  echo"清理资源..."  rm -f /tmp/tmpfile}trap cleanup EXIT INT TERM
👉 标准写法,适用于大多数脚本

最新文章

随机文章