Linux服務(wù)器磁盤空間占用情況分析與清理指南(解決方法)
為確保重大節(jié)日期間,團(tuán)隊(duì)負(fù)責(zé)的測(cè)試環(huán)境服務(wù)器磁盤不會(huì)占用過(guò)高,導(dǎo)致頻繁報(bào)警。我們要求在重大節(jié)假日前對(duì)服務(wù)器磁盤占用情況進(jìn)行檢查。如果發(fā)現(xiàn)占用過(guò)高,則需人為介入,進(jìn)行相應(yīng)清理。
一、檢查要求
查看各分區(qū)占用情況,如果達(dá)到以下任一條件,則需要人為介入判斷或處理:
(1)磁盤使用率 > 90%
(2)磁盤使用 > 80% 且 剩余空間 < 30G
(3)磁盤使用 > 70% 且 剩余空間 < 50G
二、解決辦法
使用 shell 腳本,統(tǒng)計(jì)并判斷磁盤占用情況,如有異常,輸出異常信息。
腳本代碼如下:
#!/bin/bash RED='\033[0;31m' NC='\033[0m' if [[ $1 == "detail" ]] then df -BG else IS_NORMAL=1 while read line do if [[ ${line} == Filesystem* ]]; then continue fi filesystem=$(echo ${line} | awk '{print $1}') use_rate=$(echo ${line} | awk '{print $5}' | sed 's/%//g') avail_space=$(echo ${line} | awk '{print $4}' | sed 's/G//g') mounted_on=$(echo ${line} | awk '{print $6}') if [[ ${use_rate} -gt 90 ]] || [[ ${use_rate} -gt 80 && ${avail_space} -lt 30 ]] || [[ ${use_rate} -gt 70 && ${avail_space} -lt 50 ]]; then echo -e "${RED}WARN: Filesystem ${filesystem} mounted on ${mounted_on} has problem: use rate is ${use_rate}%, available space is ${avail_space}G.${NC}" IS_NORMAL=0 fi done < <(df -BG) if [[ ${IS_NORMAL} -eq 1 ]]; then echo "INFO: Disk space usage is normal." fi fi
關(guān)鍵代碼說(shuō)明:
df -BG :命令用于報(bào)告文件系統(tǒng)的磁盤空間使用情況,-BG 選項(xiàng)表示以 G 字節(jié)為單位顯示,B的含義為:use SIZE-byte blocks
建議腳本保存路徑:/data/sh/general/disk_usage_check.sh
初始化腳本執(zhí)行命令:mkdir -p /data/sh/general/;touch /data/sh/general/disk_usage_check.sh;chmod +x /data/sh/general/disk_usage_check.sh;vim /data/sh/general/disk_usage_check.sh
三、腳本使用方法
1)根據(jù)檢查要求,判斷磁盤空間占用是否存在占用過(guò)多的情況
執(zhí)行腳本:/data/sh/general/disk_usage_check.sh
2)如由需要,可以進(jìn)一步查看各分區(qū)磁盤占用信息
執(zhí)行腳本:/data/sh/general/disk_usage_check.sh detail
使用示例,查看結(jié)果,分兩種情況:
(1)檢查正常
[root@localhost ~]# /data/sh/general/disk_usage_check.sh INFO: Disk space usage is normal.
(2)檢查異常,查看需要人為介入判斷及處理
[root@novalocal general]# /data/sh/general/disk_usage_check.sh WARN: Filesystem /dev/vdb mounted on /data has problem: use rate is 76%, available space is 47G. [root@novalocal general]# /data/sh/general/disk_usage_check.sh detail Filesystem 1G-blocks Used Available Use% Mounted on /dev/mapper/centos-root 49G 12G 38G 23% / devtmpfs 8G 0G 8G 0% /dev tmpfs 8G 1G 8G 1% /dev/shm tmpfs 8G 1G 7G 11% /run tmpfs 8G 0G 8G 0% /sys/fs/cgroup /dev/vdb 197G 142G 47G 76% /data /dev/vda1 1G 1G 1G 20% /boot tmpfs 2G 0G 2G 0% /run/user/0
處理方法可參考下一章節(jié)
四、占用定位與解決辦法
1. 查看目錄下各文給或文件夾大小,并降序輸出
[root@f2 data]# du -sh * | sort -hr 27G tomcat 5.1G did-generator 4.1G register 2.5G turbine-web 1.4G rbmq-productor 1.1G consul 600M backup 544M test-backup 527M deploy
命令解析:
du: 是 "disk usage" 的縮寫,這個(gè)命令用于估算文件或目錄在磁盤上所占用的空間。 -s: 這個(gè)選項(xiàng)告訴 du 命令僅顯示總計(jì)大小,而不列出每個(gè)子目錄或文件的大小。 -h: 這個(gè)選項(xiàng)讓 du 以易讀的格式顯示大?。ɡ?,自動(dòng)選擇 KB、MB、GB 等單位)。 -r: 這個(gè)選項(xiàng)讓 sort 命令以降序排列結(jié)果(默認(rèn)是升序)。
2. 為什么刪除被占用的文件,不能釋放空間?
在 Linux 中,當(dāng)你刪除一個(gè)文件時(shí),如果該文件仍被某個(gè)進(jìn)程所使用(即有一個(gè)打開的文件描述符指向這個(gè)文件),那么這個(gè)文件的磁盤空間并不會(huì)被立即釋放。這是因?yàn)樵?Linux 中,文件的刪除實(shí)際上是刪除了文件名和 inode 的關(guān)聯(lián),而不是刪除 inode 本身。只有當(dāng)所有關(guān)聯(lián)到該 inode 的文件描述符都被關(guān)閉后,該 inode 才會(huì)被刪除,對(duì)應(yīng)的磁盤空間才會(huì)被釋放。
如果你刪除了一個(gè)仍被進(jìn)程使用的文件,你可以通過(guò)重啟進(jìn)程或者重啟系統(tǒng)來(lái)確保所有的文件描述符都被關(guān)閉,從而釋放磁盤空間。
可以使用 lsof 命令查看該類文件
(1)查看被刪除但未釋放的文件的命令:lsof | grep '(deleted)'
(2)查看占用空間最大的被刪除但未釋放的文件:lsof | grep '(deleted)' | sort -n -r -k 7,7 | head -n 10
,命令解析:
-n:以數(shù)值進(jìn)行排序。默認(rèn)情況下,sort 命令會(huì)以字符串方式進(jìn)行排序,但是 -n 選項(xiàng)會(huì)讓 sort 命令以數(shù)值方式進(jìn)行排序。 -r:以逆序方式進(jìn)行排序。默認(rèn)情況下,sort 命令會(huì)以升序方式進(jìn)行排序,但是 -r 選項(xiàng)會(huì)讓 sort 命令以降序方式進(jìn)行排序。 -k 7,7:指定排序的字段。默認(rèn)情況下,sort 命令會(huì)以整行作為排序的依據(jù),但是 -k 選項(xiàng)可以讓 sort 命令只以指定的字段作為排序的依據(jù)。在這里,-k 7,7 表示只以第7個(gè)字段作為排序的依據(jù)。
五、遇到問(wèn)題
1. 管道模式執(zhí)行時(shí),無(wú)法更新變量值
IS_NORMAL=1 df -BG | while read line do IS_NORMAL=0 done echo ${IS_NORMAL}
上述代碼,最后輸出 IS_NORMAL 值始終為 1,無(wú)法修改為 0,原因:
在 bash 腳本中,管道符|會(huì)創(chuàng)建一個(gè)子 shell 來(lái)執(zhí)行管道符右側(cè)的命令。在這個(gè)例子中,while read line 循環(huán)就在一個(gè)子 shell 中執(zhí)行。因此,循環(huán)內(nèi)部對(duì)變量 IS_NORMAL 的修改在子 shell 中發(fā)生,不會(huì)影響到主 shell 中的變量。
要解決這個(gè)問(wèn)題,可以使用進(jìn)程替代,將 while read line 循環(huán)作為主進(jìn)程來(lái)執(zhí)行。修改后代碼如下:
IS_NORMAL=1 while read line do IS_NORMAL=0 done < <(df -BG) echo ${IS_NORMAL}
六、補(bǔ)充說(shuō)明
1. du 和 df 的區(qū)別
du
和 df
都是 Linux 系統(tǒng)中的命令,用于檢查磁盤空間使用情況,但他們的使用方式和顯示的信息有所不同。
(1) du
命令:du
是 "disk usage" 的縮寫,這個(gè)命令的主要作用是估算文件或者目錄在磁盤中占用的空間大小。它會(huì)遞歸地對(duì)目錄進(jìn)行掃描,然后將每個(gè)子目錄的大小都計(jì)算出來(lái)。
舉例:du -sh /home
這個(gè)命令會(huì)顯示 /home 目錄的總大小。-s
參數(shù)表示只顯示總計(jì),-h
參數(shù)表示以易讀的格式顯示大?。ɡ?K,M,G)。
(2)df
命令:df
是 "disk filesystem" 的縮寫,這個(gè)命令的主要作用是顯示磁盤的使用情況。它會(huì)顯示所有已掛載的文件系統(tǒng)的磁盤空間使用情況,包括總空間、已使用的空間、剩余的空間以及使用的百分比。
舉例:df -h
這個(gè)命令會(huì)以易讀的格式顯示所有已掛載的文件系統(tǒng)的磁盤空間使用情況。-h
參數(shù)表示以易讀的格式顯示大?。ɡ?K,M,G)。
總的來(lái)說(shuō),du
和 df
的主要區(qū)別在于,du
是用來(lái)查看文件或目錄的大小,而 df
是用來(lái)查看磁盤的使用情況。
到此這篇關(guān)于Linux服務(wù)器磁盤空間占用情況分析與清理指南的文章就介紹到這了,更多相關(guān)Linux服務(wù)器磁盤空間占用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Gentoo 下安裝與配置Nginx+ MySQL + PHP (fastcgi) 環(huán)境步驟分享
Gentoo 下安裝與配置Nginx+ MySQL + PHP (fastcgi) 環(huán)境步驟,需要的朋友可以參考下2013-02-02linux如何實(shí)現(xiàn)一鍵部署nfs過(guò)程圖解
這篇文章主要介紹了linux如何實(shí)現(xiàn)一鍵部署nfs過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07關(guān)于Linux搭建RabbitMQ集群環(huán)境圖文詳解
這篇文章主要介紹了關(guān)于Linux搭建RabbitMQ集群環(huán)境圖文詳解,RabbitMQ天然支持集群,集群是保證可靠性的一種方式,同時(shí)可以通過(guò)水平擴(kuò)展以達(dá)到增加消息吞吐量能力的目的,需要的朋友可以參考下2023-05-05Linux下動(dòng)態(tài)鏈接庫(kù)加載路徑及搜索路徑問(wèn)題
這篇文章主要介紹了Linux下動(dòng)態(tài)鏈接庫(kù)加載路徑及搜索路徑問(wèn)題,需要的朋友可以參考下2018-04-04keepalived實(shí)現(xiàn)nginx高可用
這篇文章主要為大家詳細(xì)介紹了keepalived實(shí)現(xiàn)nginx高可用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10配置iptables,把80端口轉(zhuǎn)到8080的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇配置iptables,把80端口轉(zhuǎn)到8080的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-12-12