找回被删除文件,当进程存在时基于lsof找回

lsof 本身只能列出当前进程打开的文件描述符,并不能直接“恢复”进程已经关闭或丢失的文件。不同场景下的处理方式差别很大:


1. 进程还在运行,但文件已被删除

常见情况:程序还持有文件句柄,文件在磁盘上被 rm 掉了。
恢复思路:从 /proc/[pid]/fd/ 中找到仍然存在的文件描述符,复制出来即可。

步骤:

  1. 查找进程和文件句柄

    1
    lsof -p <PID> | grep deleted

    结果示例:

    myproc  1234  user  4r   REG  8,1  1234567  56789 /tmp/data.log (deleted)
    

    说明进程 1234 的 fd=4 仍然指向已删除的文件。

  2. 确认对应 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)
    
  3. 将内容复制出来

    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
2
3
PID=$(pidof myproc)
lsof -p $PID | grep deleted
cp /proc/$PID/fd/4 /var/tmp/recovered.log

简言之:

  • 进程存活时:通过 /proc/[pid]/fd 复制即可。
  • 进程已退出:只能依靠底层文件系统工具尝试恢复。

Recommendation: 使用 lsof + /proc/[pid]/fd/ 在进程还活着时立即复制数据
Next step: 检查目标进程是否仍在运行,并用 lsof -p <pid> | grep deleted 确认可恢复的文件