python和shell监控linux服务器的详细代码
作者:Allen-X 发布时间:2021-11-09 06:23:22
标签:python,shell,linux
本文实例为大家分享了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
来源:https://blog.csdn.net/u010827436/article/details/45368741


猜你喜欢
- 近来想要做一做人脸识别相关的内容,主要是想集成一个系统,看到opencv已经集成了三种性能较好的算法,但是还是想自己动手试一下,毕竟算法都比
- 这个目前还是有个别无法显示,翻了下msdn貌似没看到更好的解决方案,暂时放弃继续研究,有晓得完全解决的朋友不妨回复说一声。 先附bat创建畸
- Paramiko 是由 Python 语言编写的一个扩展模块,提供了基于 SSHv2 协议 (包括客户端和服务端)的多种功能实现。通常被用来
- 前言通过辣条最近观察,大家好像对划水摸鱼是情有独钟啊。于是乎我重操旧业又写上了这么一个简单版的星空大战小游戏。当然了辣条的初衷绝对不是让你们
- 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的。 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网
- 导语九月初家里的熊孩子终于开始上学了!半个月过去了,小孩子每周都会带着一堆的数学作业回来,哈哈哈哈~真好,在家做作业就没时间打扰我写代码了。
- 实现思路需求需要将本数据库的数据进行处理(添加前缀),然后导入主数据库。但是当前数据库记录的create_time、update_time
- 1、修改本地化时间原理: 本地化时间格式化需要gettext支持, 假如你的环境没有开启此功能, 将会返回乱码, 影响#phpmyadmin
- 本文将介绍8个简洁的Python技巧,若非经验十足的程序员,你肯定有些从未见过。向着更简洁更高效,出发吧!1.通过多个键值将对象进行排序 假
- LFS 的含义为:Large File StorageGit LFS 是 Git 的扩展,旨在解决 Git 无法高效处理大文件的问题。通常情
- 我们都知道 Python 中else的基本用法是在条件控制语句中的 if...elif...else...,但是 else 还有两个其它的用
- 今天好不容易闲下来半天,所以和大家分享一下我之前总结的一套Web UI 设计命名规范,也就是网站用户界面设计(俗称网页设计)命名规范。这套规
- 页面中无法看见页面,指向的连接网页无法显示 解决方法:1、首先在Dreamweaver中不能中文作为文件名。连目录名也最好是英文的。2、如果
- request.jsp页面中有rocarsId,和ccrn两个text。 对应在数据库中表格 rocars表的msg_id,ccrn两个字段
- 前言在日常开发中,我们往往会将 JSON 解析成对应的结构体,反之也会将结构体转成 JSON。接下来本文会通过 JSON 包的两个函数,来介
- ImageField的使用笔记今天完善作业写的订单系统,主要是给每一个菜品增加图片,看起来美观一些,但是没想到这个小小的需求花了我一天时间,
- 有时候,规划师(或需求、交互)把内容呈现的框架草图搭建好后,就直接“丢”给了设计师,让设计师在画好的框架里去美化内容,出来后的效果,往往达不
- 本文介绍了python+opencv像素的加减和加权操作的实现,分享给大家。# 目标:# 1、在图像上进行算术操作,如加减以及按位操作# 2
- 目前,Python 科学栈中的所有主要项目都同时支持 Python 3.x 和 Python 2.7,不过,这种情况很快即将结束。去年 11
- 一、前言python的两个单元测试包分别是 doctest 和 unittest,这两个包的使用起来各有长处,适用于不同的场景doctest