import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartimport pymysqlimport psutilimport osimport timedef mail(name,description,disk_send_info,cpu_send_info,mem_send_info): sender = 'mail_address' password = 'mail_password' reciver = 'xxx.xx@xx.com,xxx@xx.com' #可設置多人,用逗號分隔 subject = 'xxx(監控項目名稱):%s警告'%name+ time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) msg = MIMEMultipart('mixed') #初始化 注意:標題和正文不能分別初始化 msg['From'] = sender msg['To'] = reciver msg['Subject'] = subject msg.attach(MIMEText(str(description),'plain','utf-8')) msg.attach(MIMEText(str(disk_send_info),'plain','utf-8'))#添加正式,MIMEText切記不能忘記 msg.attach(MIMEText(str(cpu_send_info),'plain','utf-8')) msg.attach(MIMEText(str(mem_send_info),'plain','utf-8')) smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.set_debuglevel(1) smtp.login(sender,password) smtp.sendmail(sender,reciver.split(','),msg.as_string()) print('%s 發送成功'%subject) smtp.quit()#得到硬盤的信息def disk_info(disk_find): # disk = psutil.disk_partitions() # for i in disk: # disk_partition = i.device #全部硬盤盤符 # disk_use = psutil.disk_usage(disk_partition) # disk_utilization = disk_use.percent disk_use = psutil.disk_usage(disk_find) disk_utilization = str(disk_use.percent) disk_total = '%sG' %(round(disk_use.total/1024/1024/1024,2)) disk_used = '%sG' %(round(disk_use.used/1024/1024/1024,2)) disk_free = '%sG' %(round(disk_use.free/1024/1024/1024,2)) disk_msg = {'總量':disk_total, '已使用':disk_used, '空閒':disk_free, '使用率':disk_utilization + '%' } return disk_msgdef cpu_info(): cpu_idle = str(os.popen("top -n 1 | sed -n '3p' | awk '{print $8}'").read()).strip() cpu_used = str(100-float(cpu_idle)) + '%' cpu_msg = {'已使用':cpu_used, '剩餘':str(cpu_idle) + '%'} return cpu_idle,cpu_msgdef memory_info(): mem_free = str(os.popen("top -n 1 | sed -n '4p' | awk '{print $8}'").read()).strip() mem_buff = str(os.popen("top -n 1 | sed -n '4p' | awk '{print $10}'").read()).strip() mem_cached = str(os.popen("top -n 1 | sed -n '5p' | awk '{print $9}'").read()).strip() mem_total = round(int(str(os.popen("top -n 1 | sed -n '4p' | awk '{print $4}'").read()).strip())/1024/1024,0) mem_free_total = round((int(mem_free) + int(mem_buff) + int(mem_cached))/1024/1024,0) mem_free_ratio = str(round(int(mem_free_total)*100/int(mem_total),2)) mem_msg = { '總量':str(mem_total) + 'G', '已使用':str(mem_total - mem_free_total) + 'G', '剩餘':mem_free_ratio + '%' } return mem_free_ratio,mem_msgdef mysql_monitor(user,password,host,port): try: conn = pymysql.connect(host = host,port = port,user = user,passwd = password) except: return '主人,數據庫沒法正常鏈接了,請儘快處理!!!' conn.close()def docker_monitor(): #disk_find = str(os.popen("df -hT | grep /data |awk 'NR==1{print}' | awk '{print $1}'").read()).strip()#讀取第一行disk_find = '/data'while True: disk_info_msg = disk_info(disk_find) cpu_tup = cpu_info() cpu_idle = cpu_tup[0] cpu_msg = cpu_tup[1] mem_tup = memory_info() mem_free_ratio = mem_tup[0] mem_msg = mem_tup[1] mysql_info = mysql_monitor('xxx(user)','xxxx(password)','192.168.1.230',3306) localtime = time.localtime() if str(localtime[3]) == '11': name = '正常' description = '主人,我乖乖的努力工做了一天喲,犒賞犒賞!!!' disk_send_info = '硬盤:' + str(disk_info_msg) cpu_send_info = 'CPU:' + str(cpu_msg) mem_send_info = '內存:' + str(mem_msg) print(disk_send_info) mail(name,description,disk_send_info,cpu_send_info,mem_send_info) if mysql_info: name = '數據庫' description = mysql_info disk_send_info = '硬盤:' + str(disk_info_msg) cpu_send_info = 'CPU:' + str(cpu_msg) mem_send_info = '內存:' + str(mem_msg) mail(name,description,disk_send_info,cpu_send_info,mem_send_info) if int(float(disk_info_msg['使用率'][0:-1])) >= 80: os.popen('docker stop default-vidio') name = '硬盤' description = '主人,我吃脹了,請給我健胃消食片!!!!' disk_send_info = '硬盤:' + str(disk_info_msg) cpu_send_info = 'CPU:' + str(cpu_msg) mem_send_info = '內存:' + str(mem_msg) mail(name,description,disk_send_info,cpu_send_info,mem_send_info) #小數後面是.0,先轉浮點數在轉整數 if int(float(cpu_idle)) <= 20 : name = 'CPU' description = '主人,我大腦不夠用了,快救救我!!!!' disk_send_info = '硬盤:' + str(disk_info_msg) cpu_send_info = 'CPU:' + str(cpu_msg) mem_send_info = '內存:' + str(mem_msg) mail(name, description, disk_send_info, cpu_send_info, mem_send_info) if int(float(mem_free_ratio)) <=20: name = '內存' description = '主人,我血液不順暢通,快疏通疏通!!!!' disk_send_info = '硬盤:' + str(disk_info_msg) cpu_send_info = 'CPU:' + str(cpu_msg) mem_send_info = '內存:' + str(mem_msg) mail(name, description, disk_send_info, cpu_send_info, mem_send_info) time.sleep(3600)