详解用Python实现自动化监控远程服务器


Posted in Python onMay 18, 2019

最近发现Python课器做很多事情,在监控服务器有其独特的优势,耗费资源少,开发周期短。

首先我们做一个定时或者实时脚本timedtask.py,让其定时监控目标服务器,两种方式:

第一种:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017/11/27 15:59
# @Desc  : 定时任务,以需要的时间间隔执行某个命令
# @File  : timedtask.py
# @Software: PyCharm
 
import time, os
from monitorserver import alltask
 
 
def roll_back(cmd, inc = 60):
  while True:
    #执行方法,函数
    alltask()
    time.sleep(inc)
 
roll_back("echo %time%", 5)

第二种:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017/11/27 15:59
# @Desc  : 定时任务,以需要的时间间隔执行某个命令
# @File  : timedtask.py
# @Software: PyCharm
 
import time, os
 
def roll_back(cmd, inc = 60):
  while True:
    #监控代码文件所在位置
    os.system('python /home/../monitorserver.py');
    time.sleep(inc)
 
roll_back("echo %time%", 5)

做过监控应该都知道,我们主要监控服务器,负载均衡、磁盘、内存、CPU、网络接口(流量)、端口代码,主要针对这些,我做了以下远程监控,第一种和第二种监控代码一样,代码monitorserver.py如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017/11/27 15:59
# @Desc  : 服务器监控代码
# @File  : monitorserver.py
# @Software: PyCharm
 
import pexpect
import re
 
import time
import threading
 
"""
主方法
127.0.0.1#远程服务器ip地址
"""
def ssh_command(user, host, password, command):
  ssh_new_key = 'Are you sure you want to continue connecting'
  child = pexpect.spawn('ssh -l %s %s %s' % (user, host, command))
  i = child.expect([pexpect.TIMEOUT, ssh_new_key, 'password: '])
  if i == 0:
    print 'ERROR!'
    print 'SSH could not login. Here is what SSH said:'
    print child.before, child.after
    return None
  if i == 1:
    child.sendline('yes')
    child.expect('password: ')
    i = child.expect([pexpect.TIMEOUT, 'password: '])
    if i == 0:
      print 'ERROR!'
      print 'SSH could not login. Here is what SSH said:'
      print child.before, child.after
      return None
  child.sendline(password)
  return child
 
 
"""
内存监控
"""
def mem_info():
 
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", "cat /proc/meminfo")
  child.expect(pexpect.EOF)
  mem = child.before
  mem_values = re.findall("(\d+)\ kB", mem)
  MemTotal = mem_values[0]
  MemFree = mem_values[1]
  Buffers = mem_values[2]
  Cached = mem_values[3]
  SwapCached=mem_values[4]
  SwapTotal = mem_values[13]
  SwapFree = mem_values[14]
  print '******************************内存监控*********************************'
  print "*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************"
  print "总内存:",MemTotal
  print "空闲内存:", MemFree
  print "给文件的缓冲大小:",Buffers
  print "高速缓冲存储器使用的大小:", Cached
  print "被高速缓冲存储用的交换空间大小:", SwapCached
  print "给文件的缓冲大小:", Buffers
  if int(SwapTotal) == 0:
    print u"交换内存总共为:0"
  else:
    Rate_Swap = 100 - 100*int(SwapFree)/float(SwapTotal)
    print u"交换内存利用率:", Rate_Swap
  Free_Mem = int(MemFree) + int(Buffers) + int(Cached)
  Used_Mem = int(MemTotal) - Free_Mem
  Rate_Mem = 100*Used_Mem/float(MemTotal)
  print u"内存利用率:", str("%.2f" % Rate_Mem), "%"
 
 
"""
内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息
"""
def vm_stat_info():
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", "vmstat 1 2 | tail -n 1")
  child.expect(pexpect.EOF)
  vmstat_info = child.before.strip().split()
  processes_waiting = vmstat_info[0]
  processes_sleep = vmstat_info[1]
  swpd = vmstat_info[2]
  free = vmstat_info[3]
  buff = vmstat_info[4]
  cache = vmstat_info[5]
  si = vmstat_info[6]
  so = vmstat_info[7]
  io_bi = vmstat_info[8]
  io_bo = vmstat_info[9]
  system_interrupt = vmstat_info[10]
  system_context_switch = vmstat_info[11]
  cpu_user = vmstat_info[12]
  cpu_sys = vmstat_info[13]
  cpu_idle = vmstat_info[14]
  cpu_wait = vmstat_info[15]
  st=vmstat_info[16]
  print '****************************内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息监控****************************'
  print "*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************"
  print "等待运行进程的数量:", processes_waiting
  print "处于不间断状态的进程:", processes_sleep
  print "使用虚拟内存(swap)的总量:", swpd
  print "空闲的内存总量:", free
  print "用作缓冲的内存总量:", buff
  print "用作缓存的内存总量:", cache
  print "交换出内存总量 :", si
  print "交换入内存总量 :", so
  print "从一个块设备接收:", io_bi
  print "发送到块设备:", io_bo
  print "每秒的中断数:", system_interrupt
  print "每秒的上下文切换数:", system_context_switch
  print "用户空间上进程运行的时间百分比:", cpu_user
  print "内核空间上进程运行的时间百分比:", cpu_sys
  print "闲置时间百分比:", cpu_idle
  print "等待IO的时间百分比:", cpu_wait
  print "从虚拟机偷取的时间百分比:", st
 
 
'''
cpu监控
'''
def cpu_info():
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", "cat /proc/cpuinfo")
  child.expect(pexpect.EOF)
  cpuinfo = child.before
  cpu_num = re.findall('processor.*?(\d+)', cpuinfo)[-1]
  cpu_num = str(int(cpu_num) + 1)
  print '***************************************cpu监控***************************************'
  print "*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************"
  print u"CPU数目:", cpu_num
  li = cpuinfo.replace('\t', '').split('\r')
  CPUinfo = {}
  procinfo = {}
  nprocs = 0
  for line in li:
    if line.find("processor") > -1:
      CPUinfo['CPU%s' % nprocs] = procinfo
      nprocs = nprocs + 1
    else:
      if len(line.split(':')) == 2:
        procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
      else:
        procinfo[line.split(':')[0].strip()] = ''
  for processor in CPUinfo.keys():
    print "CPU属于的名字及其编号、标称主频:",CPUinfo[processor]['model name']
    print "CPU属于其系列中的哪一代的代号:", CPUinfo[processor]['model']
    print "CPU制造商:", CPUinfo[processor]['vendor_id']
    print "CPU产品系列代号:", CPUinfo[processor]['cpu family']
    print "CPU的实际使用主频:", CPUinfo[processor]['cpu MHz']
 
 
"""
负载均衡
"""
def load_stat():
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", "cat /proc/loadavg")
  child.expect(pexpect.EOF)
  loadavgs = child.before.strip().split()
  print '************************负载均衡监控****************************'
  print "*******************时间:",time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),"******************"
  print "系统5分钟前的平均负载:", loadavgs[0]
  print "系统10分钟前的平均负载:", loadavgs[1]
  print "系统15分钟前的平均负载:", loadavgs[2]
  print "分子是正在运行的进程数,分母为总进程数:",loadavgs[3]
  print "最近运行的进程id:", loadavgs[4]
 
 
 
"""
获取网络接口的输入和输出
"""
def ionetwork():
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", "cat /proc/net/dev")
  child.expect(pexpect.EOF)
  netdata = child.before
  li = netdata.strip().split('\n')
  print '************************获取网络接口的输入和输出监控****************************'
  print "*******************时间:",time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),"******************"
  net = {}
  for line in li[2:]:
    line = line.split(":")
    eth_name = line[0].strip()
    # if eth_name != 'lo':
    net_io = {}
    net_io['Receive'] = round(float(line[1].split()[0]) / (1024.0 * 1024.0), 2)
    net_io['Transmit'] = round(float(line[1].split()[8]) / (1024.0 * 1024.0), 2)
    net[eth_name] = net_io
  print net
 
 
""" 
磁盘空间监控
"""
def disk_stat():
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", "df -h")
  child.expect(pexpect.EOF)
  disk = child.before
  disklist = disk.strip().split('\n')
  disklists=[]
  for disk in disklist:
    disklists.append(disk.strip().split())
  print '************************磁盘空间监控****************************'
  print "*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************"
  for i in disklists[1:]:
    print "\t文件系统:", i[0],
    print "\t容量:", i[1],
    print "\t已用:", i[2],
    print "\t可用:", i[3],
    print "\t已用%挂载点:", i[4]
 
 
""" 
端口监控
一般是远程服务器用户名用户
"""
def getComStr():
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", "netstat -tpln")
  child.expect(pexpect.EOF)
  Com = child.before
  print '******************************端口监控*********************************'
  print "*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************"
  print Com
 
 
 
"""
获取网络接口的输入和输出
"""
def cpu():
  child = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", 'cat /proc/stat | grep "cpu "')
  child.expect(pexpect.EOF)
  child1 = ssh_command("远程服务器用户名", "127.0.0.1", "远程服务器密码", 'cat /proc/stat | grep "cpu "')
  child1.expect(pexpect.EOF)
  cpus = child.before.strip().split()
  cpus1 = child1.before.strip().split()
  print '************************cpu使用情况****************************'
  print "*******************时间:",time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),"******************"
  T1=int(cpus[1])+int(cpus[2])+int(cpus[3])+int(cpus[4])+int(cpus[5])+int(cpus[6])+int(cpus[8])+int(cpus[9])
  T2=int(cpus1[1]) + int(cpus1[2]) + int(cpus1[3]) + int(cpus1[4] )+ int(cpus1[5] )+int( cpus1[6] )+ int(cpus1[8] )+ int(cpus1[9])
  Tol=T2-T1
  Idle=int(cpus1[4]) - int(cpus[4])
  print '总的cpu时间1:',T1
  print '总的cpu时间2:', T2
  print '时间间隔内的所有时间片:', Tol
  print '计算空闲时间idle:', Idle
  print "计算cpu使用率:",100*(Tol-Idle)/Tol,"%"
 
"""
第一种执行
"""
def alltask():
  try:
    threads = []
    t1 = threading.Thread(target=mem_info)
    threads.append(t1)
    t2 = threading.Thread(target=vm_stat_info)
    threads.append(t2)
    t3 = threading.Thread(target=cpu_info)
    threads.append(t3)
    t4 = threading.Thread(target=load_stat)
    threads.append(t4)
    t5 = threading.Thread(target=ionetwork)
    threads.append(t5)
    t6 = threading.Thread(target=disk_stat)
    threads.append(t6)
    t7 = threading.Thread(target=getComStr)
    threads.append(t7)
    t8 = threading.Thread(target=cpu)
    threads.append(t8)
    for n in range(len(threads)):
      threads[n].start()
  except Exception, e:
    print str(e)
 
"""
第二种执行
"""
if __name__ == '__main__':
  try:
    threads = []
    t1 = threading.Thread(target=mem_info)
    threads.append(t1)
    t2 = threading.Thread(target=vm_stat_info)
    threads.append(t2)
    t3 = threading.Thread(target=cpu_info)
    threads.append(t3)
    t4 = threading.Thread(target=load_stat)
    threads.append(t4)
    t5 = threading.Thread(target=ionetwork)
    threads.append(t5)
    t6 = threading.Thread(target=disk_stat)
    threads.append(t6)
    t7 = threading.Thread(target=getComStr)
    threads.append(t7)
    t8 = threading.Thread(target=cpu)
    threads.append(t8)
    for n in range(len(threads)):
      threads[n].start()
  except Exception, e:
    print str(e)

监控结果如下:

详解用Python实现自动化监控远程服务器

详解用Python实现自动化监控远程服务器

详解用Python实现自动化监控远程服务器

接下来做的是把监控结果可视化,即可,可惜没时间做,就交给各位了!!!

花了两天时间整理的,分享给大家,希望对各位有帮助!!!

以上所述是小编给大家介绍的用Python实现自动化监控远程服务器详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python中的闭包总结
Sep 18 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 Python
python实现图片处理和特征提取详解
Nov 13 Python
Python线性回归实战分析
Feb 01 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
实例详解Python模块decimal
Jun 26 Python
python+pygame实现坦克大战
Sep 10 Python
pytorch多GPU并行运算的实现
Sep 27 Python
Django 框架模型操作入门教程
Nov 05 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
Python实现打砖块小游戏代码实例
May 18 #Python
如何在Python中实现goto语句的方法
May 18 #Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 #Python
Python3匿名函数lambda介绍与使用示例
May 18 #Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 #Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 #Python
python的内存管理和垃圾回收机制详解
May 18 #Python
You might like
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
JS实现轮播图效果
2020/01/11 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
详解supervisor使用教程
2017/11/21 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
Python 列表反转显示的四种方法
2020/11/16 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
一份Java笔试题
2012/02/21 面试题
用Python写一个for循环的例子
2016/07/19 面试题
应届医学毕业生求职信分享
2013/12/02 职场文书
人力资源经理自我评价
2014/01/04 职场文书
运动会领导邀请函
2014/02/05 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
导游词格式
2015/02/13 职场文书
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS
mysql主从复制的实现步骤
2021/10/24 MySQL
浅谈克隆 JavaScript
2021/11/02 Javascript