服务公告

服务公告 > 技术教程 > lsof 恢复误删文件:句柄未释放时的抢救

lsof 恢复误删文件:句柄未释放时的抢救

发布时间:2026-10-11 13:56
## 案例现场 某天深夜清理日志,手一快把正在写入的数据库日志或应用日志删了:rm 执行完瞬间后悔,文件没有备份,进程还在跑。幸运的是多数情况下数据没有真丢——Linux 的删除语义是解除目录项与文件的关联,只要还有进程握着这个文件的打开句柄,数据块就不会被回收,文件在进程视角里仍然完整存在。窗口期还在,动作要快。 ## 根因与前提 这个恢复通道的原理就一条:rm 删掉的是文件名,inode 与数据块在最后一个引用关闭前不会释放。由此推出两个前提:误删文件的进程还活着,没退出没重启;恢复动作要赶在任何人关闭该进程之前做。进程一退出,句柄归零,数据块立即回到自由状态,彼时只能求助于数据恢复工具且成功率看运气。误删后正确姿势是稳住手,什么都别动,直接进入抢救步骤。 ## 抢救步骤 第一步用 lsof 找到仍被打开的已删除文件: ```bash lsof | grep deleted ``` 输出里关注三列:进程名与 PID、文件描述符数字、文件路径与大小。另一种更快的写法是 lsof 加 L 选项过滤链接数为零的文件。第二步确认就是目标文件后,从 proc 文件系统把内容拷回来: ```bash cp /proc/进程号/fd/描述符数字 /data/recovered.log ``` 拷出来的就是文件被删那一刻起的完整内容,含删除后进程继续写入的部分。第三步校验恢复件:看文件末尾是否是最新的日志时间,比对行数与进程内存里的计数。拷贝完成后,重启该进程让它按正常路径重新创建日志文件,旧句柄才算彻底了结。 ## 复盘要点 这次能救回来靠的是运气成分不小的窗口期,预防要落在前面:删文件前先 lsof 确认没进程在写;日志一律用 logrotate 管理,永远不要手工 rm 大日志;清理脚本里把 rm 换成先 truncate 清空再观察一天。在顺云的云服务器上,再配上控制台的磁盘使用率告警,磁盘告急时人工介入,而不是让慌乱中的 rm 来当救火队员。