本文实例为大家分享了python和shell监控linux服务器的具体代码,供大家参考,具体内容如下
1、 shell监控负载
监控原理:使用uptime来获取负载的信息,然后通过字符串截取的方式来获取load值来获取单个核心的负载,在将负载与阈值比较确定是否报警。
loard_monitor.sh脚本:
#!/bin/bash #使用uptime命令监控linux系统负载变化 #提取本服务器的IP地址信息 IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` #抓取cpu的总核数 cpu_num=`grep -c 'model name' /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)) print 0;print a" | bc` #取上面平均负载值的个位整数 average_int=`echo $average_load | cut -f 1 -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/env Python # coding=utf-8 """ 配合crontab来定时的读取服务器的部分信息 1、top信息 2、JVM实例信息 3、GC信息 组装成html发送邮件 """ import smtplib import os import socket import fcntl import struct import time import sys from email.mime.text import MIMEText # 获取本机ip和名称 def get_ip_address(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15]) )[20:24]) # 邮件发动方法 def send_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() return True except Exception, e: print str(e) return False # 根据shell命令返回一个list 文本 def get_text_sh(bash_sh): result = os.popen(bash_sh).read() return result.split("\n") # top信息的获取 bash_top = "top -bn 1 | 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 + " 250 4 " 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 = "<ul>" "<li><a href = '#top'>服务器top信息</a></li>" "<li><a href = '#instance'>JVM存活实例</a></li>" "<li><a href = '#gc'>GC情况</a></li>" "<li><a href = '#heap'>JVM堆信息</a></li>" "<li><a href = '#thread'>JVM线程快照及锁</a></li>" "</ul>" # 报警内容 mail_context = "<h2><font color='red'>" + sys.argv[1] + "</font></h2>" # 邮件正文 mail_context += mail_catalog + "<h3><a name = 'top'>服务器top信息:</a></h3><hr>" # 处理top信息 for line in top_arr_txt: mail_context += "<pre>" + line + "</pre>" mail_context += "<h3><a name = 'instance'>JVM存活实例10:</a></h3><hr>" # 处理jvm,并将标签退换掉 for line in jvm_instance_arr: # 并將标签符号替换成html的符号 mail_context += "<pre>" + line.replace("<", "<").replace(">", ">") + "</pre>" mail_context += "<h3><a name = 'gc'>GC情况 采样时间间隔为250ms,采样数为4:</a></h3><hr>" # 处理gc信息 for line in jvm_gc_arr: # 并將标签符号替换成html的符号 mail_context += "<pre>" + line + "</pre>" mail_context += "<h3><a name = 'heap'>JVM堆信息:</a></h3><hr>" # 处理heap信息 for line in jvm_heap_arr: # 并將标签符号替换成html的符号 mail_context += "<pre>" + line + "</pre>" mail_context += "<h3><a name = 'thread'>JVM线程快照及锁情况:</a></h3><hr>" # 处理JVM线程快照及锁情况 for line in jvm_thread_arr: # 并將标签符号替换成html的符号 mail_context += "<pre>" + line + "</pre>" mail_context += "<pre>线程快照过大,暂时未提供显示,如有需要请联系<a href = 'yourname'>your</pre>" # 入口 if __name__ == '__main__': if send_mail(mailto_list, mail_sub, mail_context): print "发送成功" else: print "发送失败"
3、crontab定时任务
#开始设置定时任务 crontab -e #15分钟执行一次 0,15,30,45 * * * * python /opt/monitor/monitor.py 2>&1 #查看任务 crontab -l
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“python和shell监控linux服务器的详细代码”评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
2024年11月26日
2024年11月26日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]