python3 簡單服務器監控,自動發送郵件

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)
相關文章
相關標籤/搜索