用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
#收到的邮件