1. 程式人生 > >df和du磁碟空間不一致

df和du磁碟空間不一致

背景

最近在伺服器上部署了一套服務,服務執行過程中不小心把日誌檔案給刪除了,測試了一下沒有影響服務的正常執行,而且沒有日誌後處理的操作就不以為意的扔那了,但不經意間也埋下了一個巨大的坑。收到伺服器磁碟報警的時候就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 去檢視磁碟空間已經正常了。