Zabbix監控Linux系統全部磁盤的總空間大小腳本

首先我是一個剛轉正進入公司的小白,各位大佬請儘管說我菜,由於寫這個腳本看似不難,實則花了我這個小白菜好多時間。剛出差到一個城市,我就被一個老同事叫練寫個客戶須要的腳本,來獲取系統磁盤的總磁盤空間大小狀況了。
剛接到這個任務的我,確定鼓足了幹勁了,內心想這不簡單嘛,百度一下就有結果了,再修改下腳本,交差!內心想的好,可真正實施起來也挺難的。
剛開始我就在想如何獲取總磁盤空間的大小呢?是df -h命令,把Size裏全部的空間都相加?可是裏面有掛載的一些目錄也算進來,確定不對。或者直接算/目錄下的總大小?看似就是這樣,但其實是沒有算進外掛的硬盤,也不對的。我就去百度。
結果我百度了好久,也不知道具體是怎麼算出全部磁盤的空間大小,我也是一邊工做一邊想的,也問了些其餘同事,過程怎樣就不說了,反正最後就肯定了用fdisk -l算總值計算總磁盤空間,由於fdisk命令能夠看到其餘掛載的硬盤信息和分區信息。用df 來算總的已使用空間大小,由於這裏實在是顯示了全部磁盤使用的信息。
fdisk -l的命令結果以下圖:
Zabbix監控Linux系統全部磁盤的總空間大小腳本
我就是要算方框中的磁盤總和大小,來表明磁盤總空間的大小。這個想法本來我也覺得是錯的,可是目前不知道用什麼辦法來代替磁盤總空間了。可是無論了,就是想先用shell腳本的三劍客--awk, grep, sed來取命令中的字符內容了。
在這裏我使用了grep -n ‘ 內容’ 的參數,用來過濾信息字符中帶有’內容’字符的行,用awk $n 來打印每行中的第幾個參數,也用awk來計算字節的總和。本來想用單位轉換的計算來算總和的,但仍是以爲儘可能簡單點好。
因而初始的shell腳本通過屢次測試,和人工計算覈對數據之後有了個雛形:
#!/bin/bash
d_t=$(fdisk -l | grep -n '磁盤' |grep -n '字節'|awk '{print $4}'|awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
#磁盤總空間
echo -e "${d_t}"
#磁盤已使用總空間
d_u=$(df | awk '{print $3}'| grep -v 已用| awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
echo -e "${d_u}"
#磁盤總剩餘空間
d_f=$[${d_t}-${d_u}]
這是一個主要的核心算法。這個是慢慢看之前學的shell腳本基礎,慢慢推算出來的。其中awk 'BEGIN{sum=0}{sum+=$1}END{print sum}'是計算一組數字的總和,相信網友之後會用到。
而後,跑去跟老同事說,大概的思路想法出來了,看看還有沒有下一個需求,而後他驗了下。提出說要加個判斷,輸入什麼值就有什麼結果,還有儘可能知足中英文的linux系統。
我想了下,這種不就是case和if,then嗎?之前學過的,而後又完善了腳本,以下:
#!/bin/bash
#磁盤總空間大小,字節單位
disk_total() {
d_t=$(fdisk -l | grep -n '磁盤' |grep -n '字節'|awk '{print $4}'|awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
if [ ${d_t} -eq 0 ];then
d_t2=$(fdisk -l | grep -n 'Disk' |grep -n 'bytes'|awk '{print $5}'|awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
echo -e "${d_t2}"
#echo -e "磁盤總空間大小爲:${d_t2}B"
else
echo -e "${d_t}"
#echo -e "磁盤總空間大小爲:${d_t}B"
fi
}
#磁盤總使用大小,注意單位是1k
disk_used() {
d_uk=$(df | awk '{print $3}'| grep -v 已用| awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
d_u=$((1000d_uk))
if [ ${d_u} -eq 0 ];then
d_u2k=$(df | awk '{print $3}'| grep -v Used| awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
d_u2=$((1000


d_u2k))
echo -e "${d_u2}"
else
echo -e "${d_u}"
fi
}
#剩餘總空間計算
disk_free() {
d_t=$(fdisk -l | grep -n '磁盤' |grep -n '字節'|awk '{print $4}'|awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
d_u=$(df | awk '{print $3}'| grep -v 已用| awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
d_f=$[${d_t}-d_u1000]
#d_f="expr $d_t-$d_u"
#echo "$d_u"
#echo "${d_u}"
if [ ${d_t} -eq 0 ];then
d_t2=$(fdisk -l | grep -n 'Disk' |grep -n 'bytes'|awk '{print $5}'|awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
d_u2=$(df | awk '{print $3}'| grep -v Used| awk 'BEGIN{sum=0}{sum+=$1}END{print sum}')
d_f2=$[${d_t2}-d_u






1000]
#d_f2=expr $d_t2-$d_u2
echo -e "${d_f2}"
else
echo -e "${d_f}"
fi
}
case "$1" in
dt)
disk_total
;;
df)
disk_free
;;
du)
disk_used
;;
*)
echo "Usage: $0 {dt=disk_total}{df=disk_free}{du=disk_used}"
;;
esac
這個腳本也是測試完善了不少次才漸漸發現了些問題的,例如:輸入df 命令時,那個used的單位不是字節了,而是kB,以前沒有認真看過,測試多臺主機後才發現了問題。
腳本測試結果以下:
Zabbix監控Linux系統全部磁盤的總空間大小腳本
看着仍是挺順利的,能夠拿去給老同事交差了。






































































linux

相關文章
相關標籤/搜索