句柄未关闭时的文件恢复
文件被删除但仍有进程持有打开句柄时,文件内容并没有真正释放,可以通过 /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 说明内容已释放,只能走备份 |
| 磁盘占用未降 | 删除后空间未释放 | 重启或终止持有句柄的进程后释放 |
数据库数据文件被误删时该技巧通常不适用:多文件依赖与一致性要求使得单文件拷贝得到的不是可用数据库,应走数据库恢复流程。
复制出来的内容未必是完整文件:写入中的日志只包含当时已写入的部分,恢复后要与业务核对,避免把截断数据当完整数据使用。