Linux怎么在Shell脚本中使用Trap捕获脚本意外退出并清理临时文件

梦瑶君_3588

梦瑶君_3588

2026-10-31

354人浏览

原创

trap 'cleanup' EXIT 必须放在脚本开头,确保变量声明和参数解析后立即注册,覆盖 HUP、INT、TERM、EXIT 信号;cleanup 中需 export 所用变量并加存在性判断,避免静默失败或误删,且须用真实信号验证生效。

linux怎么在shell脚本中使用trap捕获脚本意外退出并清理临时文件

trap 'cleanup' EXIT 必须放在脚本最开头

脚本意外退出(比如被 kill -TERM、SSH 断开触发 SIGHUP、或内部命令失败)时,只有已注册的 trap 才会执行。如果 trap 写在创建临时目录之后,那在它之前发生的中断就完全不会触发清理。

常见错误是把 trap 放在 mkdir 或 cp 后面——这等于没设。

  • 正确做法:变量声明完、参数解析后立刻写 trap 'cleanup' EXIT
  • EXIT 不是真实信号,而是 shell 退出前的兜底事件,无论 exit 0、exit 1 还是被信号终止都会触发
  • 别只绑 EXIT,高并发或服务类脚本建议加 HUP INT TERM: trap 'cleanup' HUP INT TERM EXIT

cleanup 函数里不能用局部变量,必须 export

trap 触发时,cleanup 是在子 shell 中执行的,父 shell 的局部变量(比如 tmpdir)在子 shell 里为空。

不导出就删错路径、杀错进程,甚至静默失败。

  • 所有 cleanup 需用的变量,如 TMPDIR、PID、LOCKFILE,定义后立刻 export TMPDIR PID
  • 清理动作要带存在性判断:[ -n "$TMPDIR" ] && rm -rf "$TMPDIR",避免 rm -rf "" 砸掉根目录(虽然现代 shell 有保护,但别赌)
  • 关子进程用 kill -TERM "$PID" 2>/dev/null || :,防止因 PID 不存在而让 cleanup 失败退出(set -e 下会直接中止)

别在 cleanup 里做耗时或不可控操作

信号到达后,shell 会等 cleanup 返回才真正退出。如果 cleanup 卡住(比如无超时的 curl、ssh 或 wait),整个脚本就“假死”,无法被 kill -9 之外的任何方式终结。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • 上报状态改用 timeout 3s curl -s http://log/finish?pid=$$ || :
  • 避免 wait $PID,改用 kill -0 $PID 2>/dev/null && kill -TERM $PID + 短延时检查
  • 删除大目录前可先 find "$TMPDIR" -type f -delete 分步清空,降低阻塞风险

验证 trap 是否真生效,只能用真实信号测试

只跑一遍脚本看 echo "cleanup run" 没用。很多 trap 看似写了,但信号没传到、变量没导出、或子进程抢了信号,实际根本没执行。

上线前必须模拟生产中断场景:

  • 后台启动:./script.sh & pid=$!
  • 分别执行:kill -INT $pid(Ctrl+C)、kill -TERM $pid(systemd stop)、kill -HUP $pid(SSH 断开)
  • 检查 ls /tmp/ 是否残留、ps -o pid,ppid,args | grep $pid 是否还有子进程

最容易漏的是 SIGHUP —— 它不来自用户按键,却高频出现在运维场景中,不测等于没设。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4310

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3633

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2893

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

7110

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6742

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3873

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3365

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3599

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚观shell视频教程
尚观shell视频教程

共8课时 | 1.9万人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习