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实现bucket排序算法实例分析
May 04 Python
Django中实现点击图片链接强制直接下载的方法
May 14 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
Django保护敏感信息的方法示例
May 09 Python
WxPython实现无边框界面
Nov 18 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
python实现简单学生信息管理系统
Apr 09 Python
python 将视频 通过视频帧转换成时间实例
Apr 23 Python
Django在Model保存前记录日志实例
May 14 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 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重定向的三种方法分享
2012/02/22 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python执行精确的小数计算方法
2019/01/21 Python
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
幼儿园园长自我鉴定
2013/10/22 职场文书
物业管理应届生求职信
2013/10/28 职场文书
大三在校生电子商务求职信
2013/10/29 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
基层党员对照检查材料
2014/08/25 职场文书
依法行政工作汇报
2014/10/28 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android