雖然對於磁碟的監控屬於最基礎的監控,但是很多時候往往因為疏忽而忽略監控磁碟,最終導致事故發生,磁碟監控還是需要重視起來。本案例就是要監控磁碟使用率。
具體要求如下:
1)每分鐘檢測一次磁碟狀況;
2)當磁碟空間使用率或inode使用率高於90%,需要發郵件告警,假設收件郵箱為[email protected] ;
3)統計使用率超過90%的分割槽所有子目錄的大小,並把排名前3的子目錄寫到郵件內容中發給上面的郵箱;
4)第一次告警後,如果沒有及時處理,則需要每隔30分鐘告警一次;
5)每分鐘指令碼執行時,需要檢查指令碼是否執行完,如果沒有執行完則本次不執行。
郵件指令碼如下:
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mine.text import mimetext
import sys
mail_host =
'stmp.163.com'
mail_user =
mail_pass =
'your_mail_password'
mail_postfix =
'163.com'
defsend_mail
(to_list,subject,content)
: me =
"zabbix 監控告警平台"
+"<"
+mail_user+
"@"+mail_postfix+
">"
msg = mimetext(content,
'plain'
,'utf-8'
) msg[
'subject'
]= subject
msg[
'from'
]= me
msg[
'to'
]= to_list
try: s = smtplib:smtp(
) s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(me,to_list,msg.as_string())
s.close(
)return
true
except exception,e:
print
str(e)
return
false
if __name__ ==
"__main__"
send_mail(sys.ar**[1]
, sys.ar**[2]
, sys.ar**[3]
)
# vim /usr/local/sbin/disk_check.sh
#!/bin/bash
#監控磁碟使用情況,做郵件告警及告警收斂
#把指令碼名字存入變數s_name
s_name=
`echo $0|
awk -f '/'''`
#定義收件人郵箱
mail=
"/usr/local/sbin/mail.py"
#定義檢查磁碟空間使用率函式
chk_sp()'
> /tmp/chk_sp.log
n=`wc -l /tmp/chk_sp.log |
awk''
` if
[$n -gt 0 ]
then
tag=1
for d in
`awk
'' /tmp/chk_sp.log`
dofind
$d -type d |
sed'1d'
|xargs
du -sm |
sort -nr |
head -3 #找到使用率超過90%的分割槽下面大小排名前3的子目錄
done
> /tmp/most_sp.txt
fi}#定義檢查inode使用率函式
chk_in()'
> /tmp/chk_in.log
n=`wc -l /tmp/chk_in.log |
awk''
` if
[$n -gt 0 ]
then
tag=2
fi}#定義告警函式
m_mail()'
` #檢視$log檔案最後一行的時間戳
echo
$t_s
>> /tmp/$log
#取出最後一行即上次告警的時間戳後,立即寫入當前的時間戳
v=$[
$t_s-$t_s2
]#取兩次時間戳差值if[
$v -gt 1800 ]
#差值如果超過1800s,立即發郵件
then
python $mail
$mail_user
"磁碟使用率超過90%"
"`cat $2`
" 2>/dev/null #發郵件,$2為mail函式第二個引數,這裡是乙個檔案
echo
"0"> /tmp/$log.count #定義計時器臨時檔案,並寫入0
elseif[
! -f /tmp/$log.count ]
then
echo
"0"> /tmp/$log.count #如果計時器臨時檔案不存在,需要建立並寫入0
fi
nu=`cat /tmp/$log.count`
nu2=$[
$nu+1]
#30分鐘內每發生一次告警,計數器加1
echo
$nu2
> /tmp/$log.count
if[$nu2 -gt 30 ]
then
python $mail
$mail_user
"磁碟使用率超過90%已經持續30分鐘了"
"`cat $2`
" 2>/dev/null
echo
"0"> /tmp/$log.count #第二次告警後,計數器歸0
fifi
}#把程序情況存入臨時檔案
ps aux |
grep
"$s_name"
|grep -ve "$$|grep"
> /tmp/ps.tmp
p_n=
`wc -l /tmp/ps.tmp |
awk''
`#當程序數大於0,則說明上次的指令碼還未執行完if[
$p_n -gt 0 ]
then
exit
fichk_sp
chk_inif[
$tag
== 1 ]
then
m_mail chk_sp /tmp/most_sp.txt #執行m_mail函式傳送郵件,$1是chk_sp,$2是/tmp/most_sp.txt
elif
[$tag
== 2 ]
then
m_mail chk_in /tmp/chk_in.log #執行m_mail函式傳送郵件,$1是chk_in,$2是/tmp/chk_in.log
fi
增加計畫任務:
* * * * * /bin/bash /usr/local/sbin/disk_check.sh
指令碼中,
1)$0表示指令碼本身,awk中$nf表示最後一段的值,去掉絕對路徑,剩下指令碼名字寫入變數$s_name
2)$$
為本程序pid,grep -ve "$$|grep"
排除本程序和grep程序
故障監控 磁碟使用率告警
本篇將介紹磁碟占用過多的處理方案。linux下使用df hl可以檢視當前伺服器使用情況。應用伺服器上一般來說,持續寫入,產生巨大的檔案,一般是日誌類檔案,如果是db的伺服器的話,要注意資料的增長率。使用df h檢視伺服器磁碟占用情況 使用find size 100m xargs ls lh查詢大檔案...
監控磁碟使用率的shell指令碼
本指令碼來自有學習阿銘的博文學習 公司監控最基本的一般都要監控磁碟的使用情況,否則將導致業務上的事故。一般監控要求如下 每分鐘都要掃瞄一下磁碟的狀況。當磁碟空間使用率或者inode使用率高於90 的情況,就需要報警。並把統計使用率超過90 的分割槽的所有的子目錄的,按照大小依次排列,把前3的目錄名稱...
Shell之批量監控主機磁碟使用率
1 本地磁碟監控 use rate list df h awk dev 結果 dev sda1 10 for use rate in use rate list do part name use rate if use rate ge 80 then echo warning part name p...