Linux服務(wù)器磁盤空間占用情況分析與清理指南(解決方法)
為確保重大節(jié)日期間,團隊負(fù)責(zé)的測試環(huán)境服務(wù)器磁盤不會占用過高,導(dǎo)致頻繁報警。我們要求在重大節(jié)假日前對服務(wù)器磁盤占用情況進行檢查。如果發(fā)現(xiàn)占用過高,則需人為介入,進行相應(yīng)清理。
一、檢查要求
查看各分區(qū)占用情況,如果達到以下任一條件,則需要人為介入判斷或處理:
(1)磁盤使用率 > 90%
(2)磁盤使用 > 80% 且 剩余空間 < 30G
(3)磁盤使用 > 70% 且 剩余空間 < 50G
二、解決辦法
使用 shell 腳本,統(tǒng)計并判斷磁盤占用情況,如有異常,輸出異常信息。
腳本代碼如下:
#!/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)鍵代碼說明:
df -BG :命令用于報告文件系統(tǒng)的磁盤空間使用情況,-BG 選項表示以 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ù)檢查要求,判斷磁盤空間占用是否存在占用過多的情況
執(zhí)行腳本:/data/sh/general/disk_usage_check.sh
2)如由需要,可以進一步查看各分區(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" 的縮寫,這個命令用于估算文件或目錄在磁盤上所占用的空間。 -s: 這個選項告訴 du 命令僅顯示總計大小,而不列出每個子目錄或文件的大小。 -h: 這個選項讓 du 以易讀的格式顯示大小(例如,自動選擇 KB、MB、GB 等單位)。 -r: 這個選項讓 sort 命令以降序排列結(jié)果(默認(rèn)是升序)。
2. 為什么刪除被占用的文件,不能釋放空間?
在 Linux 中,當(dāng)你刪除一個文件時,如果該文件仍被某個進程所使用(即有一個打開的文件描述符指向這個文件),那么這個文件的磁盤空間并不會被立即釋放。這是因為在 Linux 中,文件的刪除實際上是刪除了文件名和 inode 的關(guān)聯(lián),而不是刪除 inode 本身。只有當(dāng)所有關(guān)聯(lián)到該 inode 的文件描述符都被關(guān)閉后,該 inode 才會被刪除,對應(yīng)的磁盤空間才會被釋放。
如果你刪除了一個仍被進程使用的文件,你可以通過重啟進程或者重啟系統(tǒng)來確保所有的文件描述符都被關(guān)閉,從而釋放磁盤空間。
可以使用 lsof 命令查看該類文件
(1)查看被刪除但未釋放的文件的命令:lsof | grep '(deleted)'
(2)查看占用空間最大的被刪除但未釋放的文件:lsof | grep '(deleted)' | sort -n -r -k 7,7 | head -n 10,命令解析:
-n:以數(shù)值進行排序。默認(rèn)情況下,sort 命令會以字符串方式進行排序,但是 -n 選項會讓 sort 命令以數(shù)值方式進行排序。 -r:以逆序方式進行排序。默認(rèn)情況下,sort 命令會以升序方式進行排序,但是 -r 選項會讓 sort 命令以降序方式進行排序。 -k 7,7:指定排序的字段。默認(rèn)情況下,sort 命令會以整行作為排序的依據(jù),但是 -k 選項可以讓 sort 命令只以指定的字段作為排序的依據(jù)。在這里,-k 7,7 表示只以第7個字段作為排序的依據(jù)。
五、遇到問題
1. 管道模式執(zhí)行時,無法更新變量值
IS_NORMAL=1
df -BG | while read line
do
IS_NORMAL=0
done
echo ${IS_NORMAL} 上述代碼,最后輸出 IS_NORMAL 值始終為 1,無法修改為 0,原因:
在 bash 腳本中,管道符|會創(chuàng)建一個子 shell 來執(zhí)行管道符右側(cè)的命令。在這個例子中,while read line 循環(huán)就在一個子 shell 中執(zhí)行。因此,循環(huán)內(nèi)部對變量 IS_NORMAL 的修改在子 shell 中發(fā)生,不會影響到主 shell 中的變量。
要解決這個問題,可以使用進程替代,將 while read line 循環(huán)作為主進程來執(zhí)行。修改后代碼如下:
IS_NORMAL=1
while read line
do
IS_NORMAL=0
done < <(df -BG)
echo ${IS_NORMAL} 六、補充說明
1. du 和 df 的區(qū)別
du 和 df 都是 Linux 系統(tǒng)中的命令,用于檢查磁盤空間使用情況,但他們的使用方式和顯示的信息有所不同。
(1) du 命令:du 是 "disk usage" 的縮寫,這個命令的主要作用是估算文件或者目錄在磁盤中占用的空間大小。它會遞歸地對目錄進行掃描,然后將每個子目錄的大小都計算出來。
舉例:du -sh /home
這個命令會顯示 /home 目錄的總大小。-s 參數(shù)表示只顯示總計,-h 參數(shù)表示以易讀的格式顯示大?。ɡ?K,M,G)。
(2)df 命令:df 是 "disk filesystem" 的縮寫,這個命令的主要作用是顯示磁盤的使用情況。它會顯示所有已掛載的文件系統(tǒng)的磁盤空間使用情況,包括總空間、已使用的空間、剩余的空間以及使用的百分比。
舉例:df -h
這個命令會以易讀的格式顯示所有已掛載的文件系統(tǒng)的磁盤空間使用情況。-h 參數(shù)表示以易讀的格式顯示大小(例如 K,M,G)。
總的來說,du 和 df 的主要區(qū)別在于,du 是用來查看文件或目錄的大小,而 df 是用來查看磁盤的使用情況。
到此這篇關(guān)于Linux服務(wù)器磁盤空間占用情況分析與清理指南的文章就介紹到這了,更多相關(guān)Linux服務(wù)器磁盤空間占用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux實現(xiàn)301重定向和偽靜態(tài)方法
本篇文章給大家整理了在Linux實現(xiàn)301重定向和偽靜態(tài)方法以及注意事項,對此有需要的朋友可以參考學(xué)習(xí)下。2018-04-04
centos7系統(tǒng)部署k8s集群詳細(xì)介紹
大家好,本篇文章主要講的是centos7系統(tǒng)部署k8s集群詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Linux網(wǎng)絡(luò)啟動問題:Device does not seem to be present解決辦法
這篇文章主要介紹了Linux網(wǎng)絡(luò)啟動問題:Device does not seem to be present解決辦法的相關(guān)資料,希望通過本文能幫助到大家解決這樣的問題,需要的朋友可以參考下2017-10-10
如何確保Apache?Flink流處理的數(shù)據(jù)一致性和可靠性
Apache?Flink通過其先進的狀態(tài)管理、檢查點機制、時間語義和容錯策略,確保了在流處理中的高數(shù)據(jù)一致性和可靠性,本文詳細(xì)介紹了Flink中保證數(shù)據(jù)一致性和可靠性的機制,感興趣的朋友一起看看吧2024-08-08
在Linux和Windows下安裝nc(netcat)的詳細(xì)步驟
本文詳細(xì)介紹了在Linux和Windows系統(tǒng)下安裝netcat(nc)的方法,對于Linux系統(tǒng),使用APT包管理器安裝,推薦使用netcat-openbsd;對于Windows系統(tǒng),推薦使用Nmap自帶的Ncat或者下載獨立版Netcat,需要的朋友可以參考下2025-10-10
Linux使用tcpdump進行網(wǎng)絡(luò)分析詳解
tcpdump 是一個命令行數(shù)據(jù)包分析器,可實時捕獲和檢查網(wǎng)絡(luò)流量,下面就跟隨小編一起學(xué)習(xí)一下Linux如何使用tcpdump進行網(wǎng)絡(luò)分析吧2025-03-03

