
好的,所以我正在嘗試清空文件。它是一個連續寫入的文字日誌檔案。我的 ls -lh 說它是 3GB
我跑
> file.log
我的 ls -lh 說它仍然是 3GB
然而,包含該檔案的資料夾的大小減少了 3GB。很奇怪,數一下行數就知道它不是空的,而且我無法用 vim 打開它(太大)。
我沒有管理員訪問權限,但我是該文件的所有者。
我嘗試創建一個僅包含第一行的新文件來查看發生了什麼
head -1 file.log > first_line.txt
而first_line.txt是3GB。這確實是一種奇怪的行為。
問題 1:為什麼我的第一個指令沒有清空檔案?
問題2:如何清空檔案而不刪除它?
謝謝,
評論後編輯:檔案正在被其他進程連續開啟和寫入。
遺憾的是我無法幹擾這些進程,所以我無法暫時退出或重新啟動它們
答案1
您的檔案正被某個進程儲存,您無法刪除它。
用於lsof file.log
了解哪個進程正在寫入它。
然後
mv file.log old.file.log
重新啟動該進程。 (這取決於流程)。
接下來,您將能夠刪除old.file.log
.
如果您的文件 ID 列出,/etc/logrotate.d/*
您可以發出 logrotate 命令。
答案2
若要(幾乎)清空文件,請使用指令
echo "" > file.log
或者,如果您的作業系統有它,
truncate file.log --size 0
會將其截斷為 0 位元組。
如果檔案沒有任何換行符,則整個檔案可能只有 1 行長,說明檔案大小為 3 gig。
您可以使用以下命令取得檔案範例
dd if=file.log of=firstpart.txt count=1 bs=200
這將佔用檔案的前 200 個位元組。 (如果需要更多,請將「bs」參數增加到4096,如果需要更多,請使用count參數,即獲得8192個區塊,count=2 bs=4096)
@Archemar 的建議很好,但我不確定它能回答你的問題。