找回被删除文件,当进程存在时基于lsof找回
lsof 本身只能列出当前进程打开的文件描述符,并不能直接“恢复”进程已经关闭或丢失的文件。不同场景下的处理方式差别很大:
1. 进程还在运行,但文件已被删除
常见情况:程序还持有文件句柄,文件在磁盘上被 rm 掉了。
恢复思路:从 /proc/[pid]/fd/ 中找到仍然存在的文件描述符,复制出来即可。
步骤:
查找进程和文件句柄
1
lsof -p <PID> | grep deleted
结果示例:
myproc 1234 user 4r REG 8,1 1234567 56789 /tmp/data.log (deleted)说明进程 1234 的 fd=4 仍然指向已删除的文件。
确认对应 fd 路径
1
ls -l /proc/1234/fd/4
输出类似:
lrwx------ 1 user user 64 Aug 23 14:22 /proc/1234/fd/4 -> /tmp/data.log (deleted)将内容复制出来
1
cp /proc/1234/fd/4 /tmp/recovered_data.log
或者:
1
cat /proc/1234/fd/4 > /tmp/recovered_data.log
2. 进程已退出
- 如果进程已退出,那么它的
/proc/[pid]/fd已经消失,无法再通过lsof恢复。 - 只能依靠磁盘恢复手段(
extundelete,testdisk,xfs_undelete等),成功率取决于文件系统和写入情况。
3. 恢复 socket/pipe 的场景
lsof可以列出进程打开的 socket、pipe。- 但这些文件描述符一旦进程退出就彻底失效,无法恢复。
- 在进程存活时,可以通过
/proc/[pid]/fd/继续读写(前提是权限允许)。
示例
恢复被删除的日志文件:
1 | PID=$(pidof myproc) |
简言之:
- 进程存活时:通过
/proc/[pid]/fd复制即可。 - 进程已退出:只能依靠底层文件系统工具尝试恢复。
Recommendation: 使用 lsof + /proc/[pid]/fd/ 在进程还活着时立即复制数据
Next step: 检查目标进程是否仍在运行,并用 lsof -p <pid> | grep deleted 确认可恢复的文件