用python实现 linux监控硬盘大于80%_并发送邮件报警脚本V1_V2版

#################第三个版本#####################

#读取配置文件中的阀值

vi disk_configure.cfg

hd_usage_rate_threshold = 10 

#运行脚本会生成日志文件,并发送邮件到邮件中

[root@salt-master scripts]# ll
total 12
-rw-r--r-- 1 root root 29 Mar 22 19:39 disk_configure.cfg
-rwxr-xr-x 1 root root 2400 Mar 22 19:31 send_check_disk.py
-rw-r--r-- 1 root root 22 Mar 22 19:39 send_disk_message.log


[root@salt-master scripts]# cat send_disk_message.log
sendmail success!!!!!

 

#脚本

send_check_disk.py

#coding:utf-8
#author:nulige at 2018-3-16
import os
import re
import sys
import smtplib
import datetime
from email.mime.text import MIMEText

# 硬盘使用率报警阀值
#hd_usage_rate_threshold = 10
f = open("/server/scripts/disk_configure.cfg")
line = f.readline()
n1 = line.split()
n2 = n1[2]
hd_usage_rate_threshold = int(n2)

# 要发给谁
mailto_list=["huzh@hotdoor.cn","1034611705@qq.com"]

# 设置服务器,用户名、口令以及邮箱的后缀
mail_host="mail.gxycloud.com"
mail_user="huzh@hotdoor.cn"
mail_pass="lenovoe42"
mail_postfix="hotdoor.cn"

#system_log
stdout_backup = sys.stdout
log_file = open("send_disk_message.log", "w")
sys.stdout = log_file

# 发送邮件
def send_mail(to_list,sub,content):
  me = mail_user + "<"+ mail_user + "@" + mail_postfix + ">"
  msg = MIMEText(content, 'html', 'utf-8')
  msg['Subject'] = sub
  msg['From'] = me
  msg['To'] = ";".join(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

# 获得外网ip
def get_wan_ip():
        cmd_get_ip = "/sbin/ifconfig enp2s0f0|awk -F '[ :]+' 'NR==2 {print $3}'"
        get_ip_info = os.popen(cmd_get_ip).readline().strip()
        return get_ip_info

# 检测硬盘使用
def check_hd_use():
        cmd_get_hd_use = '/bin/df'
        try:
            fp = os.popen(cmd_get_hd_use)
        except:
            ErrorInfo = r'get_hd_use_error'
            print ErrorInfo
            return ErrorInfo
        re_obj = re.compile(r'^/dev/.+\s+(?P<used>\d+)%\s+(?P<mount>.+)')
        hd_use = {}
        for line in fp:
            match = re_obj.search(line)
            if match is not None:
                hd_use[match.groupdict()['mount']] = match.groupdict()['used']
        fp.close()
        return  hd_use

# 硬盘使用报警
def hd_use_alarm():
    for v in check_hd_use().values():
      if int(v) > hd_usage_rate_threshold:
        if send_mail(mailto_list,'System Disk Monitor','My_System Ip:%s\nSystem Disk Use:%s'% (get_wan_ip(),check_hd_use())):
           print  "sendmail success!!!!!"
           log_file.close()
           sys.stdout = stdout_backup
      else:
         print "disk not mail"
         log_file.close()
         sys.stdout = stdout_backup

if __name__ == '__main__':
  hd_use_alarm()

  

 

###################第二个版本####################

#coding:utf-8
#author:nulige at 2018-3-16
import os
import re
import sys
import smtplib
import datetime
from email.mime.text import MIMEText

# 硬盘使用率报警阀值
hd_usage_rate_threshold = 10

# 要发给谁
mailto_list=["huzh@hotdoor.cn","1034611705@qq.com"]

# 设置服务器,用户名、口令以及邮箱的后缀
mail_host="mail.gxycloud.com"
mail_user="huzh@hotdoor.cn"
mail_pass="lenovoe42"
mail_postfix="hotdoor.cn"

#send_log
stdout_backup = sys.stdout
log_file = open("send_disk_message.log", "w")
sys.stdout = log_file

# 发送邮件
def send_mail(to_list,sub,content):
  me = mail_user + "<"+ mail_user + "@" + mail_postfix + ">"
  msg = MIMEText(content, 'html', 'utf-8')
  msg['Subject'] = sub
  msg['From'] = me
  msg['To'] = ";".join(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

# 获得外网ip
def get_wan_ip():
        cmd_get_ip = "/sbin/ifconfig enp2s0f0|awk -F '[ :]+' 'NR==2 {print $3}'"
        get_ip_info = os.popen(cmd_get_ip).readline().strip()
        return get_ip_info

# 检测硬盘使用
def check_hd_use():
        cmd_get_hd_use = '/bin/df'
        try:
            fp = os.popen(cmd_get_hd_use)
        except:
            ErrorInfo = r'get_hd_use_error'
            print ErrorInfo
            return ErrorInfo
        re_obj = re.compile(r'^/dev/.+\s+(?P<used>\d+)%\s+(?P<mount>.+)')
        hd_use = {}
        for line in fp:
            match = re_obj.search(line)
            if match is not None:
                hd_use[match.groupdict()['mount']] = match.groupdict()['used']
        fp.close()
        return  hd_use

# 硬盘使用报警
def hd_use_alarm():
    for v in check_hd_use().values():
      if int(v) > hd_usage_rate_threshold:
        if send_mail(mailto_list,'System Disk Monitor','My_System Ip:%s\nSystem Disk Use:%s'% (get_wan_ip(),check_hd_use())):
           print  "sendmail success!!!!!"
           log_file.close()
           sys.stdout = stdout_backup
      else:
         print "disk not mail"
         log_file.close()
         sys.stdout = stdout_backup


if __name__ == '__main__':
  hd_use_alarm()

 

###################第一个版本####################

#python版本

[root@zabbix-server ~]# python
Python 2.7.5 (default, Nov 20 2015, 02:00:19) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

#创建日志目录

[root@zabbix-server web_event_extends]# cat create_nulige.sh

#!/bin/bash
mkdir -p /opt/log/nulige/web_event_extends
cd /opt/log/nulige/web_event_extends
touch event-ext-`date '+%Y-%m-%d'`.log

#先创建文件夹,再运行监控硬盘脚本

#coding:utf-8
#author:nulige at 2018-3-16
import os
import re
import smtplib
import datetime
import shelve
from email.mime.text import MIMEText

# 硬盘使用率报警阀值
hd_usage_rate_threshold = 80

# 要发给谁
mailto_list=["huzh@hotdoor.cn","1034611705@qq.com"]

# 设置服务器,用户名、口令以及邮箱的后缀
mail_host="mail.gxycloud.com"
mail_user="huzh@hotdoor.cn"
mail_pass="lenovoe42"
mail_postfix="hotdoor.cn"

# 日志偏移
log_offset = shelve.open('log_offset')

# 取当天日期
log_path_suffix=(datetime.date.today()).strftime('%Y-%m-%d')

# 当前日期key
cur_time = 'cur_time'

# 日志路径
app_info = {}
app_info['event'] = ['/opt/log/nulige/web_event_extends/event-ext-'+log_path_suffix+'.log',['失败','异常'],[]]

# 处理日志
def analysis_log(appName ,appInfo):
    cur_time_val = get_shelve_value(cur_time)
    if cur_time_val == -1:
        set_shelve_value(cur_time, log_path_suffix)
    elif log_path_suffix != cur_time_val:
        set_shelve_value(appName, 0)
        set_shelve_value(cur_time, log_path_suffix)

    f1 = file(appInfo[0], "r")
    offset = get_shelve_value(appName)
    if offset != -1:
        f1.seek(offset,1)
    else:
        set_shelve_value(appName, 0)
    count = 0
    exceptionStr = ""
    for s in f1.readlines():
        searchKey = appInfo[1]
        if len(searchKey) > 0:
            for i in searchKey:
                li = re.findall(i, s)
                if len(li) > 0:
                    count = count + li.count(i)
                    exceptionStr = exceptionStr + " " + s
        else:
            li = re.findall('Exception', s)
            if len(li) > 0:
                count = count + li.count('Exception')
                exceptionStr = exceptionStr + " " + s
    set_shelve_value(appName, f1.tell())
    print appName + " 异常数量为 " + str(count)
    return [count, "---------------------------------" + appName + " ----------------------------- \n " + exceptionStr]

#shelve 处理
def set_shelve_value(key, value):
    log_offset[key] = value

def get_shelve_value(key):
    if log_offset.has_key(key):
        return log_offset[key]
    else:
        return -1

def del_shelve_value(key):
    if log_offset.has_key(key):
        del log_offset[key]

# 发送邮件
def send_mail(to_list,sub,content):
  me = mail_user + "<"+ mail_user + "@" + mail_postfix + ">"
  msg = MIMEText(content, 'html', 'utf-8')
  msg['Subject'] = sub
  msg['From'] = me
  msg['To'] = ";".join(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

# 获得外网ip
def get_wan_ip():
        cmd_get_ip = "/sbin/ifconfig enp2s0f0|awk -F '[ :]+' 'NR==2 {print $3}'"
        get_ip_info = os.popen(cmd_get_ip).readline().strip()
        return get_ip_info

# 检测硬盘使用
def check_hd_use():
        cmd_get_hd_use = '/bin/df'
        try:
            fp = os.popen(cmd_get_hd_use)
        except:
            ErrorInfo = r'get_hd_use_error'
            print ErrorInfo
            return ErrorInfo
        re_obj = re.compile(r'^/dev/.+\s+(?P<used>\d+)%\s+(?P<mount>.+)')
        hd_use = {}
        for line in fp:
            match = re_obj.search(line)
            if match is not None:
                hd_use[match.groupdict()['mount']] = match.groupdict()['used']
        fp.close()
        return  hd_use

# 硬盘使用报警
def hd_use_alarm():
    for v in check_hd_use().values():
      if int(v) > hd_usage_rate_threshold:
        if send_mail(mailto_list,'System Disk Monitor','My_System Ip:%s\nSystem Disk Use:%s'% (get_wan_ip(),check_hd_use())):
           print  "sendmail success!!!!!"
      else:
         print "disk not mail"

if __name__ == '__main__':
  hd_use_alarm()
  exceptionCount = 0
  exceptionContents = "";
  for key in app_info:
    exceptionContent = analysis_log(key, app_info[key])
    exceptionCount += exceptionContent[0]
    exceptionContents += exceptionContent[1]
    exceptionContents = exceptionContents + "******************** \n"

  print exceptionCount
  if exceptionCount > 0:
    if send_mail(mailto_list, get_wan_ip() + " 日志报警",exceptionContents):
        print "发送成功"
    else:
        print "发送失败"

#运行结果

 说明:硬盘使用率报警阀值定义为10,就触发报警

[root@zabbix-server test_script]# python send_check_disk.py 
sendmail success!!!!!
disk not mail
sendmail success!!!!!
event 异常数量为 0
0

[root@zabbix-server test_script]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 40G 6.3G 34G 16% /
devtmpfs 5.9G 0 5.9G 0% /dev
tmpfs 5.9G 12K 5.9G 1% /dev/shm
tmpfs 5.9G 343M 5.6G 6% /run
tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup
/dev/sda1 494M 106M 389M 22% /boot
/dev/sda5 75G 1.1G 74G 2% /data
tmpfs 1.2G 0 1.2G 0% /run/user/0

#收到的邮件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-03-22 20:01  努力哥  阅读(588)  评论(0编辑  收藏  举报