File-Descriptors
截斷 fd 後未回收可用空間
我有一個保持(已刪除)狀態的舊日誌,並且在應用後
> /proc/'pid'/fd/4
空間沒有被回收。事實上,文件的大小歸零,但空間仍然被使用?我忘記了什麼嗎?我是否必須執行某種取消連結?
lr-x------ 1 root root 64 Mar 10 16:11 4 -> /var/app/logs/app.log (deleted) appl 'pid' appl 4r REG 253,2 **0** 6193157 /var/app/logs/app.log (deleted)
實際上,文件系統會回收空間,但文件的大小只是暫時減小到 0,直到仍然打開文件的程序進行下一次寫入。此時,大小增加到以前的大小,加上新寫入的數據,但您現在有一個稀疏文件,其中文件的開頭充滿了名義上的零,它們不佔用磁碟空間。
你可以通過一個簡單的測試看到這個效果。創建一個每 10 秒緩慢更新的大文件:
$ { dd count=1k if=/dev/zero; while sleep 10;do echo hi; done; } >/tmp/big & [2] 1050 $ pid=$!
檢查其大小和使用的磁碟空間:
$ ls -ls /tmp/big 516 -rw-r--r-- 1 meuh users 524516 Aug 15 15:58 /tmp/big $ du -a /tmp/big 516 /tmp/big $ df /tmp Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 1966228 2924 1963304 1% /tmp
該文件為 524516 字節,516 個塊,文件系統已使用 2924 個塊。現在使用您的
>
命令截斷文件,並立即檢查大小:$ > /proc/$pid/fd/1; ls -ls /tmp/big 0 -rw-r--r-- 1 meuh users 0 Aug 15 15:59 /tmp/big
它為零。10秒後再次檢查:
$ ls -ls /tmp/big 4 -rw-r--r-- 1 meuh users 524534 Aug 15 15:59 /tmp/big $ df /tmp Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 1966228 2416 1963812 1% /tmp
可以看到空間已經被磁碟回收了(從2924到2416用過),但是文件的大小還是和以前一樣,加了一點,但是佔用的塊數(4,第一個數
ls -ls
) 很小,因此稀疏。lsof -p $pid
還顯示偏移量,而不是大小。