https://blog.csdn.net/yiscola/article/details/61638012
https://blog.csdn.net/u011728480/article/details/37134045
https://www.cnblogs.com/allen-3/p/6104832.html
https://zhidao.baidu.com/question/555158273.html
https://www.jb51.net/LINUXjishu/224652.html
今天打開ubuntu中的eclipse,發現工程項目被刪了,去workspace中查看工程還在,但是很多文件都被刪了,本來工程文件應該有200多M,現在只有70M左右。接着系統提示磁盤空間不足,仔細查看原來是/var/log/cups/目錄下有兩個錯誤日志文件error_log和error_log.1占用了20G的磁盤空間。打開錯誤日子,里面都是
W [12/Mar/2017:20:38:28 +0800] Notifier for subscription 32 (dbus://) went away, retrying!
E [12/Mar/2017:20:38:28 +0800] File \"/usr/lib/cups/notifier/dbus\" has insecure permissions (0100777/uid=0/gid=0).
接下來想去百度下這是什么原因造成的,但是系統開機開不了。用命令行把這兩個錯誤日志強制刪除
rm -f error_log
rm -f error_log.1
清空回收站
rm -fr $HOME/.local/share/Trash/files/*
-------------------------------------------------------------
#Ps:使用的是Ubuntu14.04 x64
注意:以下的圖片是我修好之后的圖片,只是說明我是怎樣解決問題的。。。
1 博主我最近使用Ubuntu時,經常出現一個大問題。那就是磁盤寫入量特別的大,達到了90多MB/s(我在這里看的數據)
而且,硬盤燈一直狂閃。
我使用磁盤使用分析器(命令:sudo baobab):看了一下文件分布。。。下圖
2 在這里,你可以看到哪個文件的容量比較大,經比較,我發現/var/log/cups文件特別的大,刪除后error_log等文件后,還是迅速增加這些文件,
經查詢發現,可能是cups服務搗鬼,到這里,有兩個方法:
@徹底刪除log文件(簡單,粗暴,但是不能夠查看各種log 文件)
@停止cups服務
命令:sudo update-rc.d cups remove
---------------------------------------------
同時出現var/log/cups/error_log無限寫入導致ubuntu系統空間不足和sudo 命令不可用的情況,究其原因是因為對/usr文件賦值權限過大,因為要寫入/usr文件中一個文件,就將/usr賦予777的權限。以后對/usr賦值要小心 解決方法基本思路就是將權限恢復
---------------------------------------------
那我覺得你應該看看是什么原因導致這個問題的才行!
如果你已經知道問題所在,並且忽略這個問題,而且可以把error_log這里的內容清空的話可以使用如下命令:
crontab -e
*/2 * * * * echo "" > /var/log/cups/error_log
上面的操作要用root用戶來操作!
-----------------------------------------------------------
1、錯誤現象
運維的監控系統發來通知,報告一台服務器空間滿了,登陸服務器查看,根分區確實沒有空間了,如下圖所示:
這里首先說明一下服務器的一些刪除策略,由於Linux沒有回收站功能,我們的線上服務器所有要刪除的文件都會首先移動到系統/tmp目錄下,然后定期清除/tmp目錄下的數據。這個策略本身沒有問題,但是通過檢查發現這台服務器的系統分區中並沒有單獨划分/tmp分區,這樣/tmp下的數據其實是占用了根分區的空間。既然找到了問題,那么刪除/tmp目錄下一些大數據即可,執行如下命令,檢查/tmp下最大的三個數據文件,如下圖所示:
[root@localhost~ ]# du -s /tmp/*|sort -nr|head -3
69206016 /tmp/access_log
36 /tmp/hsperfdata_root
36 /tmp/hsperfdata_mapred
通過命令輸出發現在/tmp目錄下有個66G大小的文件access_log,這個文件應該是apache產生的訪問日志文件,從日志大小來看,應該是很久沒有清理apache日志文件了,基本判定是這個文件導致的根空間爆滿,在確認此文件可以刪除后,執行如下刪除操作:
[root@localhost ~]# rm /tmp/access_log
接着查看系統根分區空間是否釋放,如下圖所示:
從輸出可以看到,根分區空間仍然沒有釋放,這是怎么回事?
2、解決思路
一般說來不會出現刪除文件后空間不釋放的情況,但是也存在例外,比如文件被進程鎖定,或者有進程一直在向這個文件寫數據等等,要理解這個問題,就需要知道Linux下文件的存儲機制和存儲結構。
一個文件在文件系統中的存放分為兩個部分:數據部分和指針部分,指針位於文件系統的meta-data中,數據被刪除后,這個指針就從meta-data中清除了,而數據部分存儲在磁盤中,數據對應的指針從meta-data中清除后,文件數據部分占用的空間就可以被覆蓋並寫入新的內容,之所以出現刪除access_log文件后,空間還沒釋放,就是因為httpd進程還在一直向這個文件寫入內容,導致雖然刪除了access_log文件,但文件對應的指針部分由於進程鎖定,並未從meta-data中清除,而由於指針並未被刪除,那么系統內核就認為文件並未被刪除,因此通過df命令查詢空間並未釋放也就不足為奇了。
3、問題排查
既然有了解決問題的思路,那么接下來看看是否有進程一直在向acess.log文件中寫數據,這里需要用到Linux下的lsof命令,通過這個命令可以獲取一個已經被刪除但仍然被應用程序占用的文件列表,命令執行如下圖所示:
從輸出結果可以看到,/tmp/acess.log文件被進程httpd鎖定,而httpd進程還一直向這個文件寫入日志數據,從第七列可知,這個日志文件大小僅70G,而系統根分區總大小才100G,由此可知,這個文件就是導致系統根分區空間耗盡的罪魁禍首,在最后一列的“deleted”狀態,說明這個日志文件已經被刪除,但由於進程還在一直向此文件寫入數據,空間並未釋放。
4、解決問題
到這里問題就基本排查清楚了,解決這一類問題的方法有很多種,最簡單的方法是關閉或者重啟httpd進程,當然也可以重啟操作系統,不過這並不是最好的方法,對待這種進程不停對文件寫日志的操作,要釋放文件占用的磁盤空間,最好的方法是在線清空這個文件,可以通過如下命令完成:
[root@localhost ~]# echo " " >/tmp/acess.log
通過這種方法,磁盤空間不但可以馬上釋放,也可保障進程繼續向文件寫入日志,這種方法經常用於在線清理Apache、Tomcat、Nginx等Web服務產生的日志文件。謝謝閱讀,希望能幫到大家,請繼續關注腳本之家,我們會努力分享更多優秀的文章。
以上就是LINUX運維實戰案例之文件已刪除但空間不釋放問題的分析與解決辦法,本文出自 “技術成就夢想” 博客,謝絕轉載!謝謝閱讀,希望能幫到大家,請繼續關注腳本之家,我們會努力分享更多優秀的文章。
--------------------------------------------------------