链接到特定的 inode

链接到特定的 inode

我有一个文件被删除了,但仍被程序保持打开状态。我使用 lsof 找到了 inode 编号。如何创建指向该 inode 的硬链接?

答案1

您无法创建指向它的链接,但可以将其取回。我们来做个实验:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txt 现在已消失,但 tail 命令仍使 inode 保持活动状态。要恢复文件,首先找到保留 inode 的进程的 PID:

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

PID 为 409。chdir 到 /proc/409/fd/ 并列出内容:

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

/proc/[PID]/fd/ 目录包含指向进程使用的所有文件的文件描述符的符号链接。在本例中,符号链接“3”指向已删除的文件。因此,要恢复文件,请将内容复制到新文件:

$ cat 3 >/home/mydir/saved_file.txt

答案2

获取整个文件(如果仍然写入)以尝试tail -c +1 -f

从: https://unix.stackexchange.com/questions/25527/how-to-follow-a-la-tail-fa-binary-file-from-the-beginning

(顺便说一句:/proc 上的 fd 的 ln 不起作用,刚刚试过了)

答案3

在 Linux 下没有可移植的方法来实现这一点。最好的方法可能是让文件系统上的所有活动停止,终止保持文件打开的程序,卸载文件系统并使用文件系统调试器将其重新附加到目录。如果您通过 NFS 导出文件系统,至少某些版本的 NFS 可能允许您通过 NFS 读取文件数据。

相关内容