首页/数据/备份与容灾速查/进程句柄未关闭时的文件恢复

进程句柄未关闭时的文件恢复

文件被删除但仍有进程持有打开句柄时,可直接从 /proc/<pid>/fd 复制回来:这是恢复速度较快的一类场景,不需要扫描磁盘。

备份与容灾速查数据更新于 2026-10-13

句柄未关闭时的文件恢复

文件被删除但仍有进程持有打开句柄时,文件内容并没有真正释放,可以通过 /proc/<pid>/fd 把内容复制回来。这是恢复速度最快的一类情形,不需要扫描磁盘也不需要从备份取数据,前提是进程没有重启、句柄没有关闭。对日志、临时数据、被误删的配置文件最有效。

基本信息

适用平台Linux(procfs 与 lsof 均可查看)
权限要求读取 /proc/<pid>/fd 需 root 或同用户
前提条件删除后进程未重启、句柄未关闭
时效进程退出或重启后立即失效,应优先操作

典型使用场景

  • 日志文件被误删但采集进程仍在写:直接从句柄复制出完整历史
  • 配置文件被误删但进程仍在使用:先拷出来再做正式修复
  • 临时数据或导出文件被误删:句柄还在时抢救回来
  • 磁盘空间异常:确认是哪些已删除文件仍被占用导致空间未释放
  • 定位应用写入了哪些文件:结合句柄与进程关系排查

定位与抢救

定位与抢救
lsof +L1                       # 列出已删除但被进程占用的文件
lsof -p 12345 | grep deleted   # 只看某个进程的已删除文件
ls -l /proc/12345/fd/ | grep deleted   # 从 proc 直接查看句柄
cp /proc/12345/fd/7 /recovery/app.log  # 按句柄号复制,进程重启前有效
ls -l /recovery/app.log        # 校验大小与修改时间是否合理
sha256sum /recovery/app.log > /recovery/app.log.sha256   # 留下校验记录
# 注意:不要重启进程,重启会立即丢失句柄

关键判断

观察项含义处理
deleted 标记文件已被删除但句柄未关立即复制,不要重启进程
fd 号进程内的文件描述符编号按编号复制,勿复制目录项
文件大小当前仍可读的长度为 0 说明内容已释放,只能走备份
磁盘占用未降删除后空间未释放重启或终止持有句柄的进程后释放
数据库数据文件被误删时该技巧通常不适用:多文件依赖与一致性要求使得单文件拷贝得到的不是可用数据库,应走数据库恢复流程。
复制出来的内容未必是完整文件:写入中的日志只包含当时已写入的部分,恢复后要与业务核对,避免把截断数据当完整数据使用。

易错点

  • 先重启服务再想恢复:进程一重启句柄丢失,只能靠磁盘扫描或备份
  • 复制出的文件不校验:截断或损坏的副本被当作恢复结果使用
  • 把该技巧用于数据库数据文件:拷出的文件无法组成可用实例,浪费时间
  • 删除文件后发现空间没释放就反复删其他文件:真正占空间的是未关闭的句柄

数据来源与参考

  • man 5 proc(/proc/pid/fd)
  • lsof 手册(+L1 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌