##磁盤空間滿 因爲Linux沒有回收站功能,因此線上服務器上全部要刪除的文件都會先移動到系統/tmp目錄下,而後按期清除/tmp目錄下的數據。這個策略自己沒有問題,可是經過檢查發現這臺服務器的系統分區中並無單獨劃分/tmp分區,這樣/tmp下的數據其實佔用了根分區的空間。既然找到了問題,那麼刪除/tmp目錄下一些佔空間較大的數據文件便可,檢查/tmp下最大的三個數據文。服務器
du -sh /tmp/* | sort -nr | head -3
查看/tmp下最大的前三個數據文件 經過命令輸出發如今/tmp目錄下有個66GB大小的文件access_log,這個文件應該是Apache產生的訪問日誌文件,從日誌大小來看,應該是好久沒有清理Apache日誌文件了,基本斷定是這個文件致使的根空間爆滿,在確認此文件能夠刪除後,執行以下刪除操做:操作系統
rm /tmp/access_log
接着查看系統根分區空間是否釋放,從輸出能夠看到,根分區空間仍然沒有釋放,這是怎麼回事? ##刪除文件空間不釋放 通常來講不會出現刪除文件後空間不釋放的狀況,可是也存在例外,好比文件被進程鎖定,或者有進程一直在向這個文件寫數據等,要理解這個問題,就須要知道Linux下文件的存儲機制和存儲結構。 ##文件的數據與指針部分 一個文件在文件系統中的存放分爲兩個部分:數據部分和指針部分,指針位於文件系統的meta-data中,在將數據刪除後,這個指針就從meta-data中清除了,而數據部分存儲在磁盤中。在將數據對應的指針從meta-data中清除後,文件數據部分佔用的空間就能夠被覆蓋並寫入新的內容,之因此在出現刪除access_log文件後,空間還沒釋放,就是由於httpd進程還在一直向這個文件寫入內容,致使雖然刪除了access_log文件,可是因爲進程鎖定,文件對應的指針部分並未從meta-data中清除,而因爲指針並未刪除,系統內核就認爲文件並未刪除。 ##查找被應用程序佔用的已刪除文件列表 所以經過df命令查詢空間並未釋放也就既然有了解決問題的思路,那麼接下來看看是否有進程一直在向access_log文件中寫數據,這裏須要用到Linux下的lsof命令,經過這個命令能夠獲取一個仍然被應用程序佔用的已刪除文件列表:指針
lsof | grep delete
從輸出結果能夠看到,/tmp/access_log文件被進程httpd鎖定,而httpd進程還一直向這個文件寫入日誌數據。從第7列可知,這個日誌文件大小約70GB,而系統根分區總大小才100GB,由此可知,這個文件就是致使系統根分區空間耗盡的罪魁禍首。最後一列的「deleted」狀態說明這個日誌文件已經被刪除,但因爲進程還在一直向此文件寫入數據,所以空間並未釋放。 ##正確地清空文件 解決這一類問題的方法有不少種,最簡單的方法是關閉或重啓httpd進程,固然也能夠重啓操做系統,不過這些並非最好的方法。對待這種進程不停對文件寫日誌的操做,要釋放文件佔用的磁盤空間,最好的方法是在線清空這個文件,具體能夠經過以下命令完成:日誌
[root@localhost ~]# echo " " >/tmp/access_log
經過這種方法,磁盤空間不但能夠立刻釋放,也可保障進程繼續向文件寫入日誌,這種方法常常用於在線清理Apache、Tomcat、Nginx等Web服務產生的日誌文件。code