Linux trap 命令详解
Linux trap
命令详解
trap
是 Shell 编程中的内置命令,用于捕获和处理操作系统信号,例如 SIGINT
(Ctrl+C)、SIGTERM
(终止信号)等。其核心功能是定义在接收到特定信号时执行的命令,从而增强脚本的健壮性和可控性。
1. 核心功能与语法
-
基本语法:
trap 'command' SIGNAL # 捕获信号并执行命令 trap '' SIGNAL # 忽略信号 trap - SIGNAL # 恢复信号的默认处理方式支持同时捕获多个信号(用空格分隔)。
-
典型信号:
信号名 编号 触发场景 SIGINT
2 用户按下 Ctrl+C SIGTERM
15 进程被终止命令(如 kill
)触发EXIT
0 脚本退出时(无论正常或异常) SIGCHLD
17 子进程终止 完整列表可通过 trap -l
查看。
2. 应用场景与示例
-
脚本中断时的资源清理:
在备份脚本中捕获中断信号,确保临时文件被删除:WORK_DIR="/tmp/backup_$(date +%Y%m%d)" cleanup() { rm -rf "$WORK_DIR"; } trap cleanup EXIT INT TERM # 脚本退出或中断时触发清理
-
防止用户中断关键操作:
禁止用户通过 Ctrl+C 中断应用逻辑:trap '' INT # 忽略 SIGINT 信号
-
日志记录与调试:
在信号触发时记录调试信息:trap 'echo "[DEBUG] Signal received at line $LINENO" >> log.txt' INT TERM
3. 最佳实践
-
使用函数封装复杂逻辑:
避免直接在trap
中编写长命令,优先调用函数。log_signal() { echo "Signal $1 received" >> log; } trap 'log_signal SIGINT' INT
-
恢复默认信号处理:
在特定逻辑结束后恢复默认行为,避免副作用。trap - INT # 恢复 Ctrl+C 的默认终止行为
-
分离调试与用户输出:
通过文件描述符将日志与标准输出分离(如exec 3>debug.log
)。
4. 高级用法
-
循环中的信号处理:
在循环中捕获信号并安全退出:while true; do trap 'break' INT # 按下 Ctrl+C 时退出循环# 业务逻辑 done
-
捕获
EXIT
信号:
无论脚本如何终止,均执行清理操作:trap 'rm -f /tmp/lockfile' EXIT
总结
trap
是 Shell 脚本中管理信号的核心工具,适用于资源清理、防止误操作、调试等场景。合理使用 trap
可显著提升脚本的可靠性和用户体验。