Tar当前正在读取一个2GB的文件,我删除了它唯一的链接。我如何阻止它永远运行?

Tar当前正在读取一个2GB的文件,我删除了它唯一的链接。我如何阻止它永远运行?

更多信息:

我正在备份一个大目录tar,但那里有几个我没想到的大文件。此连接通过网络进行且速度非常慢,因此不能简单地等待连接。

这些文件中没有任何重要内容。

我用 删除了前几个内容echo > file,它保留了链接,因此 tar 将停止读取它们,但随后我在读取该目录中的 2GB 文件rm -rf时读取了整个目录。tar现在,tar拥有它的唯一链接,而且我似乎找不到任何方法让它继续前进,除非完全重新开始。

该文件位于 ext4 文件系统上,可通过 sshfs 通过网络访问。

答案1

echo >file这将是最简单的解决方案。但一旦删除了该文件,就不再可能了。

可是等等!由于您使用的是 ext4 文件系统,因此我推测该 tar 正在 Linux 上运行。 (一些但不是所有其他 Unix 变体都允许类似的解决方案。)在 Linux 上,您仍然可以通过以下方式访问已删除但打开的文件:where是打开文件的进程的进程 ID,是文件描述符,通过该文件描述符文件已打开。该文件是该文件的符号链接,但它是一个神奇的链接。即使文件被删除,它仍然有效。如果你用 来查看它,你会看到类似的东西/proc/PID/fd/FDPIDFDls -l

/proc/1234/fd/4 -> /path/to/file (deleted)

从表面上看,链接已损坏,但您实际上可以打开此文件。特别是,您可以使用类似 的内容截断它: >/proc/1234/fd/4

如果您在没有 的系统上工作/proc,则可以使用调试器使 tar 进程本身为您执行截断。将调试器附加到进程,然后使其执行,truncate(4)其中 4 是 tar 正在读取的文件描述符。例如,使用 GDB,您可以尝试类似的操作

$ ps
…     find the PID of the tar process, e.g. 1234
$ lsof -p1234
…     find the file descriptor that you want to act on, e.g. 4
$ gdb -pid 1234
(gdb) call truncate(4)
(gdb) detach

这可能会或可能不会使 tar 感到困惑,因为它可能会呈现它使用的某些数据结构不一致,因此我建议在真正尝试之前先进行试验。

答案2

停止焦油?

ps aux | grep tar

Find the pid of the tar process

kill $PID

相关内容