背景
最近在服務器上部署了一套服務,服務運行過程中不小心把日誌文件給刪除了,測試了一下沒有影響服務的正常運行,而且沒有日誌後處理的操作就不以爲意的扔那了,但不經意間也埋下了一個巨大的坑。收到服務器磁盤報警的時候就df看了一下滿了,但是du -h看的時候發現才總共130G的磁盤採用了20G不到。
問題
df -h :磁盤空間是滿的
du -h :磁盤佔用才20G不到
產生原因(百度的)
du -h
du -sh命令通過將指定文件系統路徑下所有的目錄、符號鏈接、文件使用的塊數累加起來得到總塊數以及總大小。它會遍歷這個目錄,針對所有真實存在的文件、目錄等彙總,給出最終結果
df -h
首先,獲取這個文件的文件句柄,這是會判斷這個文件是否存在!
然後,程序所有的寫入操作僅僅使用文件句柄,而不再關注具體文件是否存在!Linux中允許對一個正在寫入的文件進行刪除RM或者移動MV。應用程序獲取句柄,就直接指向到了磁盤位置,到了數據塊的級別上進行寫入了,不再檢查數據塊所屬的文件是否存在。這時候的寫入,對於其他人,由於訪問的入口–文件–不存在了,所以是看不到其寫入的內容的!
解決方案
lsof -n | grep deleted
找到打開的但被刪除的文件,然後找到使用這個文件的服務重新啓動就可以了。這個時候再用df -h 去查看磁盤空間已經正常了。