Linux trap 命令详解
Linux trap 命令详解
trap 是 Shell 编程中的内置命令,用于捕获和处理操作系统信号,例如 SIGINT(Ctrl+C)、SIGTERM(终止信号)等。其核心功能是定义在接收到特定信号时执行的命令,从而增强脚本的健壮性和可控性。
1. 核心功能与语法
-
基本语法:
trap 'command' SIGNAL # 捕获信号并执行命令 trap '' SIGNAL # 忽略信号 trap - SIGNAL # 恢复信号的默认处理方式支持同时捕获多个信号(用空格分隔)。 -
典型信号:
信号名 编号 触发场景 SIGINT2 用户按下 Ctrl+C SIGTERM15 进程被终止命令(如 kill)触发EXIT0 脚本退出时(无论正常或异常) SIGCHLD17 子进程终止 完整列表可通过 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 可显著提升脚本的可靠性和用户体验。
