python和shell监控linux服务器的详细代码
本文实例为大家分享了python和shell监控linux服务器的具体代码,供大家参考,具体内容如下
1、shell监控负载
监控原理:使用uptime来获取负载的信息,然后通过字符串截取的方式来获取load值来获取单个核心的负载,在将负载与阈值比较确定是否报警。
loard_monitor.sh脚本:
#!/bin/bash #使用uptime命令监控linux系统负载变化 #提取本服务器的IP地址信息 IP=`ifconfigeth0|grep"inetaddr"|cut-f2-d":"|cut-f1-d""` #抓取cpu的总核数 cpu_num=`grep-c'modelname'/proc/cpuinfo` #抓取当前系统15分钟的平均负载值 load_15=`uptime|awk'{print$NF}'` #计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。 average_load=`echo"scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a))print0;printa"|bc` #取上面平均负载值的个位整数 average_int=`echo$average_load|cut-f1-d"."` #当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0),直接发邮件告警 if(($average_int>0));then python/opt/monitor/monitor.py"服务器15分钟的系统单个核心平均负载为$average_load,超过警戒值1.0,请立即处理!!!" fi
2、python监控,并邮件报警,同时记录JVM等相关参数
原理:使用crontab定时任务来执行python脚本,在脚本中来调用shell命令或jvm命令获取信息,最终使用python发送监控邮件。
monitor.py
#!/usr/bin/envPython #coding=utf-8 """ 配合crontab来定时的读取服务器的部分信息 1、top信息 2、JVM实例信息 3、GC信息 组装成html发送邮件 """ importsmtplib importos importsocket importfcntl importstruct importtime importsys fromemail.mime.textimportMIMEText #获取本机ip和名称 defget_ip_address(ifname): s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) returnsocket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915,#SIOCGIFADDR struct.pack('256s',ifname[:15]) )[20:24]) #邮件发动方法 defsend_mail(to_list,sub,content):#to_list:收件人;sub:主题;content:邮件内容 me=mail_title+"<"+mail_user+"@"+mail_postfix+">"#这里的hello可以任意设置,收到信后,将按照设置显示 msg=MIMEText(content,_subtype='html',_charset='utf-8')#创建一个实例,这里设置为html格式邮件 msg['Subject']=sub#设置主题 msg['From']=me msg['To']=";".join(to_list) try: s=smtplib.SMTP() s.connect(mail_host)#连接smtp服务器 s.login(mail_user,mail_pass)#登陆服务器 s.sendmail(me,to_list,msg.as_string())#发送邮件 s.close() returnTrue exceptException,e: printstr(e) returnFalse #根据shell命令返回一个list文本 defget_text_sh(bash_sh): result=os.popen(bash_sh).read() returnresult.split("\n") #top信息的获取 bash_top="top-bn1|head-5" top_arr_txt=get_text_sh(bash_top) #服务器的JVM的pid并去掉空格 bash_pid="/usr/local/java/bin/jps|grep'Bootstrap'|awk'{print$1}'" jvm_pid=os.popen(bash_pid).read().strip() #获取JVM中存活得对象 bash_jmap="/usr/local/java/bin/jmap-histo:live"+jvm_pid+"|head-13" jvm_instance_arr=get_text_sh(bash_jmap) #JVM堆信息 bash_jmap_heap="/usr/local/java/bin/jmap-heap"+jvm_pid jvm_heap_arr=get_text_sh(bash_jmap_heap) #gc统计,采样时间间隔为250ms,采样数为4 bash_gc="/usr/local/java/bin/jstat-gc"+jvm_pid+"2504" jvm_gc_arr=get_text_sh(bash_gc) #JVM线程快照 bash_jvm_thread="jstack-l"+jvm_pid jvm_thread_arr=get_text_sh(bash_jvm_thread) #获取本机名称和IP server_name=socket.getfqdn(socket.gethostname()) #内网IP inner_ip=get_ip_address("lo") #公网IP out_ip=get_ip_address("eth0") #邮件接收者 mailto_list=["yourname@company.com"] #设置服务器 mail_host="smtp.xxx.com" #用户名 mail_user="server_monitor" #动态客户端口令 mail_pass="#######" #发件箱的后缀 mail_postfix="163.com" #标题名称 mail_title="ServerMonitor" #标题时间 mail_time=time.strftime("%Y-%m-%d%X",time.localtime(time.time())) #邮件主题 mail_sub="【监控邮件】服务器("+server_name+")--IP("+out_ip+")--时间("+mail_time+")" #目录导航 mail_catalog="
- "\
"
服务器top信息 "\
"JVM存活实例 "\
"GC情况 "\
"JVM堆信息 "\
"JVM线程快照及锁 "\
"
"+sys.argv[1]+"
"
#邮件正文
mail_context+=mail_catalog+"服务器top信息:
" #处理top信息 forlineintop_arr_txt: mail_context+="
"+line+"" mail_context+="
JVM存活实例10:
" #处理jvm,并将标签退换掉 forlineinjvm_instance_arr: #并將标签符号替换成html的符号 mail_context+="
"+line.replace("<","<").replace(">",">")+"" mail_context+="
GC情况采样时间间隔为250ms,采样数为4:
" #处理gc信息 forlineinjvm_gc_arr: #并將标签符号替换成html的符号 mail_context+="
"+line+"" mail_context+="
JVM堆信息:
" #处理heap信息 forlineinjvm_heap_arr: #并將标签符号替换成html的符号 mail_context+="
"+line+"" mail_context+="
JVM线程快照及锁情况:
" #处理JVM线程快照及锁情况 forlineinjvm_thread_arr: #并將标签符号替换成html的符号 mail_context+="
"+line+"" mail_context+="
线程快照过大,暂时未提供显示,如有需要请联系" #入口 if__name__=='__main__': ifsend_mail(mailto_list,mail_sub,mail_context): print"发送成功" else: print"发送失败"your
3、crontab定时任务
#开始设置定时任务 crontab-e #15分钟执行一次 0,15,30,45****python/opt/monitor/monitor.py2>&1 #查看任务 crontab-l
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。