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线程锁(thread)学习示例
Dec 04 Python
Python中__init__和__new__的区别详解
Jul 09 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
Python登录注册验证功能实现
Jun 18 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
python从入门到精通 windows安装python图文教程
May 18 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
Python计算信息熵实例
Jun 18 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
Python使用Kubernetes API访问集群
May 30 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函数,php爱好者站推荐
2007/03/19 PHP
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
php函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
Javascript之BOM(window对象)详解
2016/05/25 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
python实现多人聊天室
2020/03/31 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
Python中的延迟绑定原理详解
2019/10/11 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
Python发送邮件实现基础解析
2020/08/14 Python
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
大学毕业通用个人的求职信
2013/12/08 职场文书
公司企业表扬信
2014/01/11 职场文书
会计岗位说明书
2014/07/29 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
居委会工作总结2015
2015/05/18 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
Python中with上下文管理协议的作用及用法
2022/03/18 Python
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫