Files
Tar 目前正在讀取一個 2GB 的文件,我刪除了它唯一的連結。我如何阻止它永遠執行?
更多資訊:
我正在用 備份一個大目錄
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,因為它可能會呈現一些它使用的資料結構不一致,因此我建議在實際嘗試之前進行試驗。