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 相关文章推荐
pymongo实现多结果进行多列排序的方法
May 16 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
Python函数式编程实例详解
Jan 17 Python
python 回溯法模板详解
Feb 26 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
Python 如何展开嵌套的序列
Aug 01 Python
python通过cython加密代码
Dec 11 Python
python中封包建立过程实例
Feb 18 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中的数组操作函数整理
2008/08/18 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
2017/07/04 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python中文编码问题小结
2014/09/28 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
高中的职业生涯规划书
2013/12/28 职场文书
委托书范文
2014/04/02 职场文书
运动会拉拉队口号
2014/06/09 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
员工2014年度工作总结
2014/12/09 职场文书
Nginx快速入门教程
2021/03/31 Servers
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
Python中22个万用公式的小结
2021/07/21 Python