更多信息:
我正在备份一个大目录tar
,但那里有几个我没想到的大文件。此连接通过网络进行且速度非常慢,因此不能简单地等待连接。
这些文件中没有任何重要内容。
我用 删除了前几个内容echo > file
,它保留了链接,因此 tar 将停止读取它们,但随后我在读取该目录中的 2GB 文件rm -rf
时读取了整个目录。tar
现在,tar
拥有它的唯一链接,而且我似乎找不到任何方法让它继续前进,除非完全重新开始。
该文件位于 ext4 文件系统上,可通过 sshfs 通过网络访问。
答案1
echo >file
这将是最简单的解决方案。但一旦删除了该文件,就不再可能了。
可是等等!由于您使用的是 ext4 文件系统,因此我推测该 tar 正在 Linux 上运行。 (一些但不是所有其他 Unix 变体都允许类似的解决方案。)在 Linux 上,您仍然可以通过以下方式访问已删除但打开的文件:where是打开文件的进程的进程 ID,是文件描述符,通过该文件描述符文件已打开。该文件是该文件的符号链接,但它是一个神奇的链接。即使文件被删除,它仍然有效。如果你用 来查看它,你会看到类似的东西/proc/PID/fd/FD
PID
FD
ls -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