File-Descriptors

截斷 fd 後未回收可用空間

  • August 15, 2016

我有一個保持(已刪除)狀態的舊日誌,並且在應用後

> /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還顯示偏移量,而不是大小。

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