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 去查看磁盤空間已經正常了。

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