python 监控 linux 系统状态并发送邮件
监控linux的 磁盘,cpu个数,内存使用,负载,并发送邮件。
1 [root@js-93 monitor_linux]# cat check_linux_status.py 2 #!/usr/bin/env python3 3 # -*- coding:utf-8 -*- 4 import os,sys 5 import smtplib 6 import email.mime.multipart 7 import email.mime.text 8 import psutil 9 import time,datetime 10 import subprocess 11 import re 12 13 14 start_system_time = datetime.datetime.fromtimestamp(psutil.boot_time()) 15 now_time = datetime.datetime.now() 16 start_system_time_value = time.mktime(start_system_time.timetuple()) 17 now_time_value = time.mktime(now_time.timetuple()) 18 sys_start_days = round((now_time_value-start_system_time_value)/(3600*24)) 19 #print("系统已经启动了 %s 天!" % sys_start_days) 20 21 22 def get_ip_info(): 23 cmd_get_ip = "ifconfig |sed -n '/inet addr/p'|sed 's#^.*addr:##g'|sed 's# Bcast.*$##g'|grep -v '127.*'" 24 res=subprocess.Popen(cmd_get_ip,shell=True,stderr=subprocess.PIPE,stdin=subprocess.PIPE,stdout=subprocess.PIPE) 25 ip = res.stdout.read() 26 return ip.decode('utf-8') 27 28 def send_email(message): 29 msg = email.mime.multipart.MIMEMultipart() 30 msg['from'] = '发件箱账号' 31 msg['to'] = '收件箱账号' 32 msg['subject'] = "%s 服务器监控报警" % get_ip_info() 33 content = ''' 34 IP : %s 35 当前系统启动天数:%s days 36 报警信息: 37 %s 38 39 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 40 系统当前状况: 41 %s 42 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 43 ''' % (get_ip_info(),sys_start_days,message,linux_all_check_info()) 44 txt = email.mime.text.MIMEText(content) 45 msg.attach(txt) 46 47 smtp = smtplib.SMTP() 48 smtp.connect('smtp.exmail.qq.com', '25') 49 smtp.login( '发送邮件的账号','发件箱密码') 50 smtp.sendmail( 'support@deepbrain.ai',['ryan***','***@qq.com'], str(msg)) 51 smtp.quit() 52 53 def mem_check(): 54 mem_dict = {} 55 #memory 使用check 56 mem = psutil.virtual_memory() 57 total_mem = mem.total/1024/1024/1024 58 used_mem = mem.used/1024/1024/1024 59 free_mem = mem.free/1024/1024/1024 60 real_used_mem = total_mem - free_mem 61 mem_used_precent = "%s" % round((real_used_mem / total_mem * 100)) 62 mem_dict['mem_used_precent'] = mem_used_precent 63 # swap 分区check 64 swap_info = psutil.swap_memory() #swap 65 swap_total = round(int(swap_info[0])/1024/1024/1024,2) 66 swap_free = round(int(swap_info[2])/1024/1024/1024 ,2) 67 swap_used_precent = "%s" % round(((swap_total - swap_free)/swap_total )) 68 mem_dict['swap_used_precent'] = swap_used_precent 69 return mem_dict 70 71 def cpu_check(): 72 cpu_info_dic = {} 73 cpu_number = psutil.cpu_count() 74 physics_cpu_number = psutil.cpu_count(logical=False) 75 cpu_info_dic['logic_cpu'] = cpu_number 76 cpu_info_dic['physics_cpu'] = physics_cpu_number 77 return cpu_info_dic 78 79 def check_disk(): 80 cmd_get_disk_use = '/bin/df' 81 res = subprocess.Popen(cmd_get_disk_use,shell=True,stderr=subprocess.PIPE,stdin=subprocess.PIPE,stdout=subprocess.PIPE) 82 fp = res.stdout.read() 83 with open('disk_info.log','w') as obj01: 84 obj01.write(fp.decode('utf-8')) 85 re_obj = re.compile(r'^/dev/.+\s+(?P<used>\d+)%\s+(?P<mount>.+)') 86 disk_use = {} 87 with open('disk_info.log','r') as obj02: 88 for line in obj02: 89 match = re_obj.search(line) 90 if match is not None: 91 disk_use[match.groupdict()['mount']] = match.groupdict()['used'] 92 return disk_use 93 94 def load_stat_check(): 95 loadavg = {} 96 f = open("/proc/loadavg") 97 con = f.read().split() 98 f.close() 99 loadavg['lavg_1']=con[0] 100 loadavg['lavg_5']=con[1] 101 loadavg['lavg_15']=con[2] 102 loadavg['nr']=con[3] 103 loadavg['last_pid']=con[4] 104 return loadavg 105 106 107 def linux_all_check_info(): 108 info_list = [] 109 #内存信息 110 dic = mem_check() 111 mem_pcrent = dic.get('mem_used_precent') 112 swap_pcrent = dic.get('swap_used_precent') 113 into_list_mem = "当前使用内存:%s%%" % mem_pcrent 114 into_list_swap = "当前使用swap:%s%%" % swap_pcrent 115 info_list.append(into_list_mem) 116 info_list.append(into_list_swap) 117 #cpu信息 118 cpu_info = cpu_check() 119 logic_cpu_num = cpu_info.get('logic_cpu') 120 physics_cpu_num = cpu_info.get('physics_cpu') 121 into_list_cpu_logic = "逻辑CPU个数:%s " % logic_cpu_num 122 into_list_cpu_physics = "物理CPU个数:%s" % physics_cpu_num 123 info_list.append(into_list_cpu_logic) 124 info_list.append(into_list_cpu_physics) 125 #磁盘信息 126 disk_info = check_disk() 127 for key,val in disk_info.items(): 128 check_info = '磁盘" %s " 使用超过百分之80 , 当前使用了百分之 %s .' % (key,val) 129 info_list.append(check_info) 130 #负载统计 131 load_1 = load_stat_check()['lavg_1'] 132 load_5 = load_stat_check()['lavg_5'] 133 load_15 = load_stat_check()['lavg_15'] 134 load_info = "当前负载为:%s,前5分钟负载为:%s ,前15分钟负载为: %s " % (load_1,load_5,load_15) 135 info_list.append(load_info) 136 137 info_last = "\n".join(info_list) 138 #print(info_last) 139 return info_last 140 141 def main(): 142 message = [] 143 #内存检查 144 dic = mem_check() 145 mem_precent = dic.get('mem_used_precent') 146 swap_precent = dic.get('swap_used_precent') 147 if int(mem_precent) > 10 : 148 info = u'内存使用已超过百分之85,当前已使用了百分之 %s ' % mem_precent 149 message.append(info) 150 if int(swap_precent) > 70: 151 info02 = u'swap使用已超过百分之70,当前已使用了百分之 %s ' % swap_precent 152 message.append(info02) 153 #磁盘检查 154 disk_info = check_disk() 155 for key,val in disk_info.items(): 156 if int(val) > 80: 157 check_info = '磁盘" %s " 使用超过百分之80 , 当前使用了百分之 %s .' % (key,val) 158 message.append(check_info) 159 160 #负载检查 161 load_1 = load_stat_check()['lavg_1'] 162 load_5 = load_stat_check()['lavg_5'] 163 load_15 = load_stat_check()['lavg_15'] 164 if float(load_1) > 1.00: 165 load_info = "当前负载为:%s,前5分钟负载为:%s ,前15分钟负载为: %s " % (load_1,load_5,load_15) 166 message.append(load_info) 167 168 169 info_last = "\n".join(message) 170 if len(message) > 0: 171 send_email(info_last) 172 #print(info_last) 173 174 175 if __name__ == '__main__': 176 main()