Files
查找並刪除已打開但已刪除的大文件
如何找到已刪除但仍在應用程序中打開的大文件?即使程序打開了這樣的文件,如何才能刪除它?
情況是我們正在執行一個以極快的速度填充日誌文件的程序。我知道原因,我可以解決它。在那之前,我想在不關閉程序的情況下 rm 或清空日誌文件。
簡單地做
rm output.log
只會刪除對文件的引用,但它會繼續佔用磁碟空間,直到程序終止。更糟糕的是:在rm
ing 之後,我現在無法找到文件的位置或文件的大小!有沒有辦法找到文件,並可能清空它,即使它仍然在另一個程序中打開?我特別指的是基於 Linux 的作業系統,例如 Debian 或 RHEL。
如果你不能殺死你的應用程序,你可以截斷而不是刪除日誌文件來回收空間。如果文件沒有以附加模式打開(帶有
O_APPEND
),那麼文件將在下次應用程序寫入文件時顯示為與之前一樣大(儘管前導部分稀疏並且看起來好像包含 NUL 字節),但空間將被回收(但不適用於 Apple OS/X 上不支持稀疏文件的 HFS+ 文件系統)。要截斷它:
: > /path/to/the/file.log
如果它已經被刪除,在 Linux 上,您仍然可以通過執行以下操作截斷它:
: > "/proc/$pid/fd/$fd"
$pid
打開文件的程序的程序 ID在哪裡,以及$fd
它在哪個文件描述符下打開(您可以使用lsof -p "$pid"
.如果您不知道 pid,並且正在尋找已刪除的文件,您可以執行以下操作:
lsof -nP | grep '(deleted)'
lsof -nP +L1
,正如@user75021 所提到的,它是一個更好(更可靠、更便攜)的選項(列對外連結接少於 1 個的文件)。或者(在 Linux 上):
find /proc/*/fd -ls | grep '(deleted)'
或者找到大的
zsh
:ls -ld /proc/*/fd/*(-.LM+1l0)
另一種方法是,如果應用程序是動態連結的,則將調試器附加到它並使其呼叫
close(fd)
後跟一個新的open("the-file", ....)
.