利用python监控linux系统cpu、内存、文件系统的使用情况以及简单的邮件报警
学习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 );
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 使用Python-Diamond收集监控数据
- 下一篇: 基于python的内存监控系统