Files

Tar 目前正在讀取一個 2GB 的文件,我刪除了它唯一的連結。我如何阻止它永遠執行?

  • October 1, 2015

更多資訊:

我正在用 備份一個大目錄tar,但那裡只有幾個我沒想到的大文件。這個連接是通過網路連接的,而且速度很慢,所以不能簡單地等待它。

這些文件中沒有任何重要內容。

我用 刪除了前幾個的內容echo > file,它保留了連結,因此 tar 將停止讀取它們,但隨後我在讀取該目錄中的 2GB 文件rm -rf時 ’d 了整個目錄。tar現在,tar擁有它的唯一連結,除了完全重新開始之外,我似乎找不到任何讓它繼續前進的方法。

該文件位於 sshfs 通過網路訪問的 ext4 文件系統上。

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,因為它可能會呈現一些它使用的資料結構不一致,因此我建議在實際嘗試之前進行試驗。

引用自:https://unix.stackexchange.com/questions/233128