1. 程式人生 > 實用技巧 >linux中解決檔案已刪除但空間不釋放的問題

linux中解決檔案已刪除但空間不釋放的問題

1、介紹

阿里雲監控發來郵件通知,磁碟使用率超過90%,提示需要清理磁碟,但是明明檔案已刪除:

登入阿里雲後臺檢視,曲線圖也是佔用了90%
如圖:

du -sh *//檢視根目錄檔案大小,發現並沒有什麼特大的檔案

df -h//看到dec佔用了300多個G

這是系統根目錄,之前我刪除了很多日誌檔案,但是目前看來,空間沒有釋放

2、解決思路

一般來說不會出現刪除檔案後空間不釋放的情況,但是也存在例外,比如檔案被程序鎖定,或者有程序一直在向這個檔案寫資料等,要理解這個問題,就需要知道Linux下檔案的儲存機制和儲存結構。

一個檔案在檔案系統中的存放分為兩個部分:資料部分和指標部分,指標位於檔案系統的meta-data中,在將資料刪除後,這個指標就從meta-data中清除了,而資料部分儲存在磁碟中。在將資料對應的指標從meta-data中清除後,檔案資料部分佔用的空間就可以被覆蓋並寫入新的內容,之所以在出現刪除日誌檔案後,空間還沒釋放,就是因為httpd程序還在一直向這個檔案寫入內容,導致雖然刪除了日誌檔案,但是由於程序鎖定,檔案對應的指標部分並未從meta-data中清除,而由於指標並未刪除,系統核心就認為檔案並未刪除,因此通過df命令查詢空間並未釋放也就不足為奇了。

3、問題排查

既然有了解決問題的思路,那麼接下來看看是否有程序一直在向access_log檔案中寫資料,這裡需要用到Linux下的lsof命令,通過這個命令可以獲取一個仍然被應用程式佔用的已刪除檔案列表,命令執行如下:
一般可能沒安裝這個命令,需自己yum install lsof -y 安裝(以centos為例)
lsof | grep deleted
如圖:

從輸出結果可以看到,日誌檔案被程序php鎖定,而php程序還一直向這個檔案寫入日誌資料。從第7列可知,可得知日誌檔案大小,由此可知,刪除的這些日誌,才是最終禍首。最後一列的“deleted”狀態說明這個日誌檔案已經被刪除,但由於程序還在一直向此檔案寫入資料,因此空間並未釋放。

4、解決問題

到這裡問題就基本排查清楚了,解決這一類問題的方法有很多種,最簡單的方法是關閉或重啟php程序,當然也可以重啟作業系統,不過這些並不是最好的方法。對待這種程序不停對檔案寫日誌的操作,要釋放檔案佔用的磁碟空間,最好的方法是線上清空這個檔案,具體可以通過如下命令完成:
echo " " >xx.log
通過這種方法,磁碟空間不但可以馬上釋放,也可保障程序繼續向檔案寫入日誌,這種方法經常用於線上清理Apache、Tomcat、Nginx等Web服務產生的日誌檔案。
某種情況下,不能重啟服務或者伺服器,可以使用
kill -9 pid

殺死這些程序,然後再使用
df -h


檢視
已經釋放了