ls -lh文件大小比du -sh大

ls -lh文件大小比du -sh小的情況參考 https://blog.csdn.net/wangtingting_100/article/details/80913868

du顯示的是文件佔block大小,通常1byte的文件,du大小是4bytes,這個是可以理解的,可偏偏ls -lh的結果比du -sh的要大。

ls顯示的是文件的邏輯大小,du顯示的是磁盤佔用情況,邏輯佔用大於磁盤本身佔用情況,這是爲什麼呢?

$ ls -lh xxx.log
-rw-rw-r-- 1 app app 152G Apr 25 09:44 xxx.log


$ du -sh xxx.log 
228M    xxx.log

#--apparent-size,效果與ll相同。因爲--apparent-size查看的文件實際大小非佔用block大小。
$ du --apparent-size  -lh xxx.log 
152G    xxx.log

原因是文件所佔磁盤被釋放,但進程正在寫入的文件的offset並咩有改變,從而形成了空洞文件,而ls顯示大小是將空洞算在內的。 此時,我們用lsof(list open files)是看不到deleted狀態的文件的,但用sudo lsof-check.sh 可以看到一些寫入文件的offset。

$ df -h #重啓後,磁盤大小已經恢復正常
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        50G  3.3G   44G   7% /
/dev/vdb        197G  8.3G  189G   5% /data


總結:
清理有進程不停寫入的文件,在不停進程情況下, 雖可以採用sudo bash -c "echo > /logs/xxx.log"方式有效避免打開句柄未正常關閉問題。但會偶現磁盤正常釋放,但進程寫入的offset並未更新的情況。這裏有一個嘗試的想法,有興趣的可以嘗試,類似於在線修改表結構的處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章