今天下班某電商技術(shù)部leader發(fā)現(xiàn)個(gè)問(wèn)題,說(shuō)他們服務(wù)器硬盤(pán)滿了。把日志文件都刪掉了,可硬盤(pán)空間依舊滿。于是df -h查看了下各個(gè)掛載點(diǎn)的狀況(如下圖)。
/dev/sda3占用了100%,那么我們du -s -h ./*看下目錄的占用情況(如下圖)。
linux磁盤(pán)掛載點(diǎn)目錄占用情況(圖)
掛載點(diǎn)下的目錄之和遠(yuǎn)小于4.5G,那么是什么占用了硬盤(pán)呢?
以下為該問(wèn)題的解答:
在apache/tomcat服務(wù)在運(yùn)行狀態(tài)下,清空了運(yùn)行服務(wù)的日志,從而導(dǎo)致了/dev/sda3 滿了的問(wèn)題。一般情況下,大多數(shù)服務(wù)(包括腳本)在運(yùn)行時(shí),是不能刪除當(dāng)前正在寫(xiě)入的日志文件的。
原理分析:
1. 當(dāng)前access.log日志正在被apache進(jìn)程占用。
2. 通過(guò)rm命令刪除access.log,實(shí)際只刪除了文件名(該日志文件應(yīng)用記數(shù)不為0,因此空間不會(huì)被釋放)。
3. 通過(guò)rm命令刪除了access.log后,apache依然寫(xiě)日志到access.log中,當(dāng)開(kāi)啟apache進(jìn)程時(shí),已經(jīng)通過(guò)access.log定位到該文件的inode了,就是說(shuō)再寫(xiě)日志是不通過(guò)access.log,因此即使刪除了access.log,apache依然寫(xiě)日志到access.log所在的inode節(jié)點(diǎn),所以導(dǎo)致硬盤(pán)空間增加。
4. 因?yàn)閯h除了access.log,所以我們就找不到該文件了,du也查不到,就會(huì)出現(xiàn)硬盤(pán)滿了但看不到究竟是哪些文件占用的。
(寫(xiě)的不甚詳細(xì),不明白的大家再google下。)
解決方法:
重啟該日志文件的相關(guān)服務(wù)或程序,如:為apache日志文件則重啟apache(如下圖,重啟后才硬盤(pán)空間占用正常)。