利用python监控linux系统cpu、内存、文件系统的使用情况以及简单的邮件报警

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/killvoon/article/details/50924198

学习python的初衷便是希望通过python,写点自动运维的程序,替代我工作中的日常巡检。

初学python,很多东西都没有掌握,花了一个星期,磕磕绊绊的写了点基于linux的简单监控,本想接着写点windows的监控,觉得有点意兴阑珊,只好期待下周能再接再厉了。

写的有点乱,都是以函数来实现功能,期待对python熟练后可以优化代码。

#!/usr/bin/python
#author:killvoon
import paramiko
import psutil
import cx_Oracle
import smtplib
from email.mime.text import MIMEText
from email.header import Header 

##定义主机列表(先只弄linux)
linux=['192.168.95.223','192.168.95.222']
   
def connectHost(ip,uname='root',passwd='oracle'):

   ssh=paramiko.SSHClient()
   ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
   ssh.connect(ip,username=uname,password=passwd)
   return ssh

def MainCheck():
#查看linux文件系统使用率
   #建立主机连接
 for a in range(len(linux)):
   try:
    ssh=connectHost(linux[a])
    #查看文件系统命令
    cmd="df -h|sed '1d'|awk '{print $2\",\" $3\",\" $4\",\" $6\",\" $5}'"
    stdin,stdout,stderr=ssh.exec_command(cmd)
    filesystem_usage=stdout.readlines()
    #查看系统时间
    chk="date \"+%Y-%m-%d %H:%M:%S\""
    stdin,stdout,stderr=ssh.exec_command(chk)
    check_time=stdout.readlines()
    check_time=check_time[0]
    #查看主机名
    hostname="hostname"
    stdin,stdout,stderr=ssh.exec_command(hostname)
    hostname=stdout.readlines()
    hostname=hostname[0]
    #循环列表,将文件系统使用率插入到数据库中
    for i in range(len(filesystem_usage)):
      list_1=filesystem_usage[i]
      list_1=list(list_1.split(','))
      #print(len(list_1))
      sql='insert into filesys_usage values(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',sysdate)' %(linux[a],hostname,list_1[0],list_1[1],list_1[2],list_1[3],list_1[4],check_time)
      #print(sql)
      db=connectDB()
      sqlDML(sql,db)
      
    #查看cpu使用率,并将信息写入到数据库中(取三次平均值)
    cpu="vmstat 1 3|sed  '1d'|sed  '1d'|awk '{print $15}'"
    stdin,stdout,stderr=ssh.exec_command(cpu)
    cpu=stdout.readlines()
    cpu_usage=str(round((100 - (int(cpu[0])+int(cpu[1])+int(cpu[2]))/3),2))+'%'
    sql="insert into cpu_usage values('%s','%s','%s',sysdate)" %(linux[a],cpu_usage,check_time)
    db=connectDB()
    sqlDML(sql,db)

    #查看内存使用率,并将信息写入到数据库中

    mem="cat /proc/meminfo|sed -n '1,4p'|awk '{print $2}'"
    stdin,stdout,stderr=ssh.exec_command(mem)
    mem=stdout.readlines()
    mem_total=round(int(mem[0])/1024)
    mem_total_free=round(int(mem[1])/1024) + round(int(mem[2])/1024) +round(int(mem[3])/1024)
    mem_usage=str(round(((mem_total-mem_total_free)/mem_total)*100,2))+"%"
    sql="insert into mem_usage values('%s','%s','%s','%s','%s','%s','%s',sysdate)" %(linux[a],str(round(int(mem[0])/1024))+"M",str(round(int(mem[1])/1024))+"M",str(round(int(mem[2])/1024))+"M",str(round(int(mem[3])/1024))+"M",mem_usage,check_time)
    db=connectDB()
    sqlDML(sql,db)

    
   except TimeoutError:
       error='can not connect,please check server machine!'
       sql='insert into error_report values(\'%s\',\'%s\',sysdate,\'%s\')' %(linux[a],check_time,error)
       print("连接服务器 %s 异常" %(linux[a]))
       db=connectDB()
       sqlDML(sql,db)
       sendMail()
       continue

       
def connectDB(dbname='orcl'):
   if dbname=='orcl':
     connstr='system/king@192.168.95.223/orcl'
     db=cx_Oracle.connect(connstr)
     return db
        
def sqlDML(sql,db):
    cr=db.cursor()
    cr.execute(sql)
    cr.close()
    db.commit()

##定义邮件函数
    
def sendMail():
   sender='xxxxxx@163.com'
   receiver=['xxxx@qq.com','xxxx@qq.com']
   subject="有监控报警邮件,请注意查收!"
   smtpserver='smtp.163.com'
   username='xxxxxxx@163.com'
   password='xxxxxxxxxxxx'   
   msg=MIMEText('服务器连接出现问题!','plain','utf-8')  ##plain 换成text后便发送不了邮件正文
   msg['Subject'] =Header(subject,'utf-8')
   smtp=smtplib.SMTP()
   smtp.connect('smtp.163.com')
   smtp.login(username,password)
   smtp.sendmail(sender,receiver,msg.as_string())
   smtp.quit()
   
if __name__=='__main__':
   MainCheck()
   
   

上周忘了添加建表脚本,我使用的是oracle数据库,毕竟熟悉:

-----文件系统相关信息表
create table filesys_usage(ip varchar2(20),
                           hostname varchar2(50),
                           total_size varchar2(20),
                           used_size varchar2(20),
                           free_size varchar2(20),
                           filesys_name varchar2(100),
                           useage_percent varchar2(10),
                           check_time varchar2(40),
                           db_time date);

-----错误日志表
create table error_report(ip varchar2(20),
                          check_time varchar2(40),
                          db_time date,
                          error varchar2(1000));

-----cpu 使用率表
create table cpu_usage(ip varchar2(20),
                       cpu_used varchar2(10),
                       check_time varchar2(40),
                       db_time date);



------mem使用率表

create table mem_usage(ip varchar2(20),
                       mem_total varchar2(40),
                       mem_free varchar2(40),
                       buffers varchar2(40),
                       cached varchar2(40),
                       mem_used varchar2(10),
                       check_time varchar2(40),
                       db_time date
                       );



展开阅读全文

没有更多推荐了,返回首页