trap命令用于在shell脚本中捕获信号并执行自定义逻辑,如优雅退出、资源清理;支持int、term、exit、err等信号,需注意引号使用、作用域及继承性。

Linux 中 trap 命令用于在 Shell 脚本中捕获特定信号,并执行预定义的命令或函数,从而实现优雅退出、资源清理、调试响应等目的。它不改变信号默认行为,而是为指定信号注册自定义处理逻辑。
trap 基本语法和常见用法
trap 的核心形式是:trap 'command' SIGNAL_NAME 或 trap 'command' SIGNAL_NUMBER
例如:
-
trap 'echo "收到 INT 信号"; exit 1' INT—— 按 Ctrl+C 时打印信息并退出 -
trap 'rm -f /tmp/mytemp.txt' EXIT—— 脚本结束前(无论成功或失败)清理临时文件 -
trap 'log_error "脚本被终止"' TERM—— 收到kill -TERM时记录日志
常用信号及对应场景
Shell 脚本中常捕获的信号包括:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- INT(2):用户按 Ctrl+C,适合交互式中断处理
-
TERM(15):默认的
kill发送信号,用于请求程序正常终止 -
EXIT(特殊):脚本退出前触发(包括
exit、自然结束、错误退出),最常用于清理 -
ERR(特殊):任意命令返回非零状态时触发(需启用
set -o errtrace才能在函数中生效) - HUP(1):终端挂起或连接断开时,适合守护类脚本重载配置
实际编写技巧与注意事项
使用 trap 时要注意作用域、引号、继承性等细节:
- 用单引号包裹命令,避免变量过早展开;如需变量替换,用双引号并转义特殊字符
- 在函数内定义的
trap默认只在该函数作用域生效;加-g参数可设为全局(Bash 4.3+) - 多个信号可共用一个处理命令:
trap 'cleanup' INT TERM EXIT - 清除某个 trap:用
trap - SIGNAL;清空所有:用trap(不带参数) - 子 shell 中的 trap 不会自动继承父 shell,需显式传递或重新定义
一个完整示例脚本
以下是一个带清理和错误捕获的实用模板:
#!/bin/bash
<p>tmpfile="/tmp/script_$$"</p><p>cleanup() {
echo "正在清理: $tmpfile"
rm -f "$tmpfile"
}</p><p>error_handler() {
echo "错误发生在第 $1 行,命令:$2"
cleanup
exit 1
}</p><p>trap cleanup EXIT
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
trap 'echo "收到中断信号,正在退出..."; cleanup; exit 128' INT TERM</p><p>touch "$tmpfile"
echo "模拟运行中..."
sleep 10
</p>
运行时按 Ctrl+C 或执行 kill -TERM $! 都会触发对应清理逻辑。










