python和shell监控linux服务器的详细代码


Posted in Python onJune 22, 2018

本文实例为大家分享了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:
  # 并?⒈昵┓?盘婊怀?tml的符号
  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:
  # 并?⒈昵┓?盘婊怀?tml的符号
  mail_context += "<pre>" + line + "</pre>"

mail_context += "<h3><a name = 'heap'>JVM堆信息:</a></h3><hr>"

# 处理heap信息
for line in jvm_heap_arr:
  # 并?⒈昵┓?盘婊怀?tml的符号
  mail_context += "<pre>" + line + "</pre>"

mail_context += "<h3><a name = 'thread'>JVM线程快照及锁情况:</a></h3><hr>"

# 处理JVM线程快照及锁情况
for line in jvm_thread_arr:
  # 并?⒈昵┓?盘婊怀?tml的符号
  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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python群发邮件实例代码
Jan 03 Python
跟老齐学Python之再深点,更懂list
Sep 20 Python
Python创建xml的方法
Mar 10 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
python里运用私有属性和方法总结
Jul 08 Python
windows上安装python3教程以及环境变量配置详解
Jul 18 Python
python实现批量文件重命名
Oct 31 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
python Plotly绘图工具的简单使用
Mar 03 Python
基于python实现操作git过程代码解析
Jul 27 Python
python中plot实现即时数据动态显示方法
Jun 22 #Python
Python+selenium 获取一组元素属性值的实例
Jun 22 #Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 #Python
python+selenium打印当前页面的titl和url方法
Jun 22 #Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 #Python
python实现比较文件内容异同
Jun 22 #Python
python实现输入数字的连续加减方法
Jun 22 #Python
You might like
PHP中session变量的销毁
2014/02/27 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python连接PostgreSQL数据库的方法
2016/11/28 Python
python进行TCP端口扫描的实现
2018/12/21 Python
Python制作动态字符图的实例
2019/01/27 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
专业求职信撰写要诀
2014/02/18 职场文书
3.12植树节活动总结2014
2014/03/13 职场文书
降消项目实施方案
2014/03/30 职场文书
求职信结尾怎么写
2014/05/26 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸