欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

5. 监控磁盘使用率

程序员文章站 2024-03-22 18:16:40
...

虽然对于磁盘的监控属于最基础的监控,但是很多时候往往因为疏忽而忽略监控磁盘,最终导致事故发生,磁盘监控还是需要重视起来。本案例就是要监控磁盘使用率。

具体要求如下:

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 = '[email protected]'
mail_pass = 'your_mail_password'
mail_postfix = '163.com'
def send_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.argv[1], sys.argv[2], sys.argv[3])

参考脚本如下:

# vim /usr/local/sbin/disk_check.sh
#!/bin/bash
#监控磁盘使用情况,做邮件告警及告警收敛

#把脚本名字存入变量s_name
s_name=`echo $0|awk -F '/' '{print $NF}'`

#定义收件人邮箱
mail="/usr/local/sbin/mail.py"
mail_user=[email protected]


#定义检查磁盘空间使用率函数
chk_sp()
{
    df -m |sed '1d' |awk -F '%| +' '$5>90 {print $7,$5}' > /tmp/chk_sp.log
    n=`wc -l /tmp/chk_sp.log |awk '{print $1}'`
    if [ $n -gt 0 ]
    then
        tag=1
        for d in `awk '{print $1}' /tmp/chk_sp.log`
        do
            find $d -type d |sed '1d' |xargs du -sm |sort -nr |head -3           #找到使用率超过90%的分区下面大小排名前3的子目录
        done > /tmp/most_sp.txt
    fi
}

#定义检查inode使用率函数
chk_in()
{
    df -i |sed '1d' |awk -F '%| +' '$5>90 {print $7,$5}' > /tmp/chk_in.log
    n=`wc -l /tmp/chk_in.log |awk '{print $1}'`
    if [ $n -gt 0 ]
    then
        tag=2
    fi
}

#定义告警函数
m_mail()
{
    log=$1
    t_s=`date +%s`
    t_s2=`date -d "1 hour ago" +%s`
    if [ ! -f /tmp/$log ]
    then
        touch /tmp/$log         #创建$log文件
        chattr +a /tmp/$log         #增加a权限,仅允许追加内容
        echo $t_s2 >> /tmp/$log         #第一次告警,可直接写入1小时前的时间戳
    fi
    
    t_s2=`tail -1 /tmp/$log |awk '{print $1}'`          #查看$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
    else
        if [ ! -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
        fi
    fi
}

#把进程情况存入临时文件
ps aux |grep "$s_name" |grep -vE "$$|grep" > /tmp/ps.tmp
p_n=`wc -l /tmp/ps.tmp |awk '{print $1}'`

#当进程数大于0,则说明上次的脚本还未执行完
if [ $p_n -gt 0 ]
then
    exit
fi

chk_sp
chk_in

if [ $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 shell