在linux脚本中捕获中断信号需用trap命令注册响应逻辑,支持sigint、sigterm和exit,但sigkill和sigstop无法捕获;语法为trap 'command' signal,可多信号绑定,推荐封装为函数并注意子shell继承与exec重置问题。

在 Linux 脚本中捕获并处理中断信号(比如 Ctr+C 触发的 SIGINT),核心是用 trap 命令注册自定义响应逻辑,让脚本不直接退出,而是执行清理、保存状态或优雅终止等操作。
明确要捕获的信号类型
常见需捕获的中断类信号有:
- SIGINT(2号):用户按 Ctrl+C 发送,最常用
-
SIGTERM(15号):外部调用
kill发送,用于请求正常终止 -
EXIT:不是真实信号,但
trap支持它,表示脚本任何原因退出前都会触发,适合做统一清理
注意:SIGKILL(9号)和 SIGSTOP(19号)无法被捕获或忽略,这是内核强制行为,脚本对此无控制权。
基本 trap 语法与写法要点
格式为:trap 'command' signal_name 或 trap 'command' signal_number
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 命令部分建议用单引号包裹,避免 shell 提前展开变量或特殊字符
- 可一次捕获多个信号:
trap 'echo "exiting"; cleanup' INT TERM EXIT - 若命令较复杂,推荐封装成函数再调用,提高可读性和复用性
典型实用写法示例
一个带资源清理的脚本片段:
#!/bin/bash
<p>tmpfile="/tmp/myscript.$$"</p><p>cleanup() {
echo "Cleaning up: $tmpfile"
rm -f "$tmpfile"
}</p><h1>捕获中断和终止信号,也确保退出时清理</h1><p>trap 'cleanup; exit 1' INT TERM
trap 'cleanup' EXIT</p><h1>创建临时文件并模拟长时间运行</h1><p>touch "$tmpfile"
echo "PID: $$, press Ctrl+C to test..."
sleep 30
</p>
这样无论用户 Ctrl+C、外部 kill,还是脚本自然结束,临时文件都会被删除。
进阶注意事项
实际使用中容易踩坑的地方:
- 子 shell(如管道、
$(...))会继承trap,但若用exec启动新进程,则 trap 会被重置为默认 - 如果想临时取消某个 trap,可用
trap - SIGINT;想清空所有 trap,用trap(不带参数) - 避免在 trap 处理中调用可能被信号中断的命令(如未加保护的
read),否则可能引发嵌套中断 - 调试时可加日志:
trap 'echo "$(date): SIGINT caught" >> /tmp/trap.log' INT










