不知道大家有沒有碰到過磁盤分區(qū)寫滿,導(dǎo)致新數(shù)據(jù)寫入不了,造成網(wǎng)站出現(xiàn)了問題。之前自己有幾次碰到過這種情況,自己當(dāng)時緊急解決辦法是:刪除網(wǎng)站的日志文件,刪除了mysql的binlog日志。
當(dāng)然我們是不希望發(fā)生此類問題的,如果網(wǎng)站總出現(xiàn)不穩(wěn)定或打不開情況,會給用戶一種不靠譜的感覺。所以,對于磁盤分區(qū)的使用,我們需要實時監(jiān)控,當(dāng)超過預(yù)設(shè)值時,就發(fā)送份郵件或短信給管理員,將錯誤扼殺至搖籃里。
對于此腳本的編寫是很簡單的,主要一點就是獲取到磁盤分區(qū)的使用率。我們知道df命令可以列出各個分區(qū)的空間使用情況:
#?df? Filesystem?????1K-blocks?????Used?Available?Use%?Mounted?on devtmpfs?????????3986648????????0???3986648???0%?/dev tmpfs????????????3999984????????0???3999984???0%?/dev/shm tmpfs????????????3999984??????528???3999456???1%?/run tmpfs????????????3999984????????0???3999984???0%?/sys/fs/cgroup /dev/vda1???????41931756?17576208??24355548??42%?/ /dev/vdb1???????52403200???476572??51926628???1%?/data /dev/vdb2??????104806400?29255772??75550628??28%?/www tmpfs?????????????799996????????0????799996???0%?/run/user/0 /dev/vdb3???????52402180???398576??52003604???1%?/mnt
我們可以看到各個分區(qū)的空間使用情況。然后接口grep命令以及awk命令,過濾掉其他信息,只留下各個分區(qū)的使用情況信息。
我們只想得到以/dev/開頭的分區(qū)信息
#?df?|?grep?^/dev /dev/vda1???????41931756?17576264??24355492??42%?/ /dev/vdb1???????52403200???476572??51926628???1%?/data /dev/vdb2??????104806400?29255980??75550420??28%?/www /dev/vdb3???????52402180???398576??52003604???1%?/mnt
然后繼續(xù)使用awk命令過濾不想要的信息
#?df?|?grep?^/dev?|?awk?'{print?$1":"$5}' /dev/vda1:42% /dev/vdb1:1% /dev/vdb2:28% /dev/vdb3:1%
拿到各個分區(qū)的使用率后,下面就是對其進行循環(huán)遍歷,依次判斷各個分區(qū)的使用情況。
下面給出完成的代碼:
#!/bin/bash #?監(jiān)控分區(qū)的空間使用情況,超過預(yù)設(shè)值告警 export?PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:~/bin export?LANG=en #?分區(qū)空間使用率閥值 USE_LIM=70 while?((1)) do ????disks=$(?df?|?grep?^/dev?|?awk?'{print?$1":"$5}') ????for?disk?in?$disks ????do ????????used=$(echo?$disk?|?cut?-d:?-f2?|?cut?-d'%'?-f1) ???????? ????????if?[?"$used"?-ge?"$USE_LIM"?];then ????????????#?調(diào)用告警腳本,這里直接用echo來替代了 ????????????echo?"$(echo?$disk?|?cut?-d:?-f1)?is?used?$used%" ????????fi ????done ???? ????sleep?10 done
注意:一般我們服務(wù)器上用的語系都是英文的,特別是在編寫shell腳本的時候,建議加上這樣一行
export?LANG=en
因為我們是要做實時的監(jiān)控,所以腳本里使用了死循環(huán),表示此腳本不會停會一直循環(huán)執(zhí)行。當(dāng)然,執(zhí)行速度也是要做限制的,不然占用太多服務(wù)器資源就不太好了。所以這里使用了sleep 10,表示10秒監(jiān)控一次。
另外這里還要一點需要注意,就是過濾掉百分號%。這里我們使用了cut命令來過濾掉%,然后拿到純數(shù)字型的分區(qū)使用率和預(yù)設(shè)值做比較。