删除正在运行的程序的目录

删除正在运行的程序的目录

我在一个目录上启动了一个程序,但不小心删除了它以及里面的程序。该程序生成几个输出文件。该程序仍在运行。我想知道如果我创建相同的目录,程序仍会在那里创建输出文件。那可能吗?

答案1

一旦文件条目从文件系统中删除,就无法重新创建它们。如果您使用旧目录的名称创建一个新目录,那么它只是:一个新目录。这些文件不会再次神奇地出现。

Unix(包括 Linux)文件系统的工作原理是通过包含文件所有信息的 inode 来工作,除了其名称。在目录中,条目由名称和索引节点号组成,这是名称与其内容的唯一耦合。可以使用ln和完全不同的文件名创建另一个指向该文件的链接。

当文件被删除时,其引用计数就会减少。一旦达到零,文件实际上被删除(它占用的空间将返回到空闲块池,并且 inode 被清除)。但是,只要进程仍然打开文件,引用计数没有达到零,文件仍然存在。

Linux 通过伪文件系统使进程打开的文件可用/proc/。如果您知道进程的进程 ID (pid),请在 /proc/pid/fd/ 中查找打开的文件列表。例如,对于一个apache进程,这里有一个缩写列表:

$ sudo ls -l /proc/32704/fd
total 0
lr-x------ 1 root root 64 Nov 20 02:39 0 -> /dev/null
l-wx------ 1 root root 64 Nov 20 02:39 1 -> /dev/null
lr-x------ 1 root root 64 Nov 20 02:39 10 -> /dev/random
lrwx------ 1 root root 64 Nov 20 02:39 11 -> /tmp/.ZendSem.6DE1g1 (deleted)
lrwx------ 1 root root 64 Nov 20 02:39 12 -> anon_inode:[eventpoll]
l-wx------ 1 root root 64 Nov 20 02:39 2 -> /var/log/apache2/error.log

请注意附加到它的行(deleted)。 Apache 将其用于其他人无法访问的临时文件:它创建并打开该文件,然后取消链接(删除)它。但是它仍然可以使用它,并且 apache 的子进程也可以使用它,因为它们继承了打开的文件。

在您的情况下,您还应该能够找到已删除的文件。通过 /proc 条目,只要进程正在运行,您就可以将“已删除”文件复制到安全的地方:

sudo cp /proc/pid/fd/x $HOME/somewheresafe/filename

相关内容