很多運維同學都遇到過“磁碟告警”,遇到這種情況就需要去清理磁碟。 這時候,很多同學通過各種途徑、手段、命令找到了占用磁碟比較大的文件,然後大手一揮, sudo rm -rvf xxxxx.log 以為這樣任務就完成了,誰知道,一查詢磁碟使用量還是居高不下,完全沒有釋放。 這是因為在Linux中,如果 ...
很多運維同學都遇到過“磁碟告警”,遇到這種情況就需要去清理磁碟。
這時候,很多同學通過各種途徑、手段、命令找到了占用磁碟比較大的文件,然後大手一揮,
sudo rm -rvf xxxxx.log
以為這樣任務就完成了,誰知道,一查詢磁碟使用量還是居高不下,完全沒有釋放。
這是因為在Linux中,如果你刪除一個正在被使用的文件,磁碟空間不會立即釋放。Linux使用了一種稱為"刪除掛起"的機制。當你刪除一個文件時,文件系統會將該文件標記為已刪除,但實際上並不會立即從磁碟上刪除它。只有當所有正在使用該文件的進程關閉時,磁碟空間才會被釋放。
這時候,不知道怎麼處理了,網上的解決辦法基本上是讓你重啟相應的進程。當然我們可以不重啟進程。直接重啟主機唄(皮一下就很開心)。
下麵我說一種不需要重啟進程或者主機的辦法,不一定能完全解決大家的問題,方法僅供參考
1、如何查詢哪些文件被刪除了,但是空間沒有釋放
下麵以/data目錄為例
sudo lsof /data | grep deleted |sort -k7rn | less
2、查詢出來結果如下圖,我們需要關註第2和第4列內容,後面需要用到
3、這時候我們執行
sudo ls -l /proc/3198801/fd/1 命令中: 3198801: 就是進程號 1: 是第四列w前面的數字 ,如 1w,則id為1,如 47w,則id為47
4、這裡我們可以查詢到這個命令是存在的,於是我們執行下列命令
sudo cp /dev/null /proc/3198801/fs/1
5、執行完成後,再次使用命令查詢磁碟空間是否釋放掉。
6、這個命令我在自己運維的環境中跑過,是能解決此類問題的。不過這個方法為什麼能夠解決問題,或者是否僅僅適用某些特定的場景,個中緣由還請各位大佬自行探索吧。