Python实现Linux监控的方法


Posted in Python onMay 16, 2019

工作原理:基于/proc 文件系统

Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc 存在于内存而不是硬盘中。proc 文件系统提供的信息如下:

进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的进程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。

系统信息:如果需要了解整个系统信息中也可以从/proc/stat 中获得,其中包括 CPU 占用情况、磁盘空间、内存对换、中断等。

CPU 信息:利用/proc/CPUinfo 文件可以获得中央处理器的当前准确信息。

负载信息:/proc/loadavg 文件包含系统负载信息。

系统内存信息:/proc/meminfo 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等。

/proc 目录中的主要文件的说明

-   apm 高级电源管理信息

-   cmdline 这个文件给出了内核启动的命令行

-   CPUinfo 中央处理器信息

-   devices 可以用到的设备(块设备/字符设备)

-   dma 显示当前使用的 DMA 通道

-   filesystems 核心配置的文件系统

-   ioports 当前使用的 I/O 端口

-   interrupts  这个文件的每一行都有一个保留的中断

-   kcore   系统物理内存映像

-   kmsg    核心输出的消息,被送到日志文件

-   mdstat  这个文件包含了由 md 设备驱动程序控制的 RAID 设备信息

-   loadavg 系统平均负载均衡

-   meminfo 存储器使用信息,包括物理内存和交换内存

-   modules 这个文件给出可加载内核模块的信息。lsmod 程序用这些信息显示有关模块的名称,大小,使用数目方面的信息

-   net 网络协议状态信息

-   partitions  系统识别的分区表

-   pci pci 设备信息

-   scsi    scsi 设备信息

-   self    到查看/proc 程序进程目录的符号连接

-   stat    这个文件包含的信息有 CPU 利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间

-   swaps   显示的是交换分区的使用情况

-   uptime  这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲

-   version 这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息

获取 CPU 的信息

#!/usr/bin/env Python
from __future__ import print_function
from collections import OrderedDict
import pprint
def CPUinfo():
''' Return the information in /proc/CPUinfo
as a dictionary in the following format:
CPU_info['proc0']={...}
CPU_info['proc1']={...}
'''
CPUinfo=OrderedDict()
procinfo=OrderedDict()
nprocs = 0
with open('/proc/CPUinfo') as f:
for line in f:
if not line.strip():
# end of one processor
CPUinfo['proc%s' % nprocs] = procinfo
nprocs=nprocs+1
# Reset
procinfo=OrderedDict()
else:
if len(line.split(':')) == 2:
procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
else:
procinfo[line.split(':')[0].strip()] = ''
return CPUinfo
if __name__=='__main__':
CPUinfo = CPUinfo()
for processor in CPUinfo.keys():
print(CPUinfo[processor]['model name'])

简单说明一下清单 1,读取/proc/CPUinfo 中的信息,返回 list,每核心一个 dict。其中 list 是一个使用方括号括起来的有序元素集合。List 可以作为以 0 下标开始的数组。Dict 是 Python 的内置数据类型之一, 它定义了键和值之间一对一的关系。OrderedDict 是一个字典子类,可以记住其内容增加的顺序。常规 dict 并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。在 OrderedDict 中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。

获取系统的负载信息

#!/usr/bin/env Python  
import os 
def load_stat(): 
loadavg = {} 
f = open("/proc/loadavg") 
con = f.read().split() 
f.close() 
loadavg['lavg_1']=con[0] 
loadavg['lavg_5']=con[1] 
loadavg['lavg_15']=con[2] 
loadavg['nr']=con[3] 
loadavg['last_pid']=con[4] 
return loadavg 
print "loadavg",load_stat()['lavg_15']

简单说明一下清单 2:清单 2 读取/proc/loadavg 中的信息,import os :Python 中 import 用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import 模块名 [as 别名],如果只需要导入模块中的部分或全部内容可以用形式:from 模块名 import *来导入相应的模块。OS 模块 os 模块提供了一个统一的操作系统接口函数,os 模块能在不同操作系统平台如 nt,posix 中的特定函数间自动切换,从而实现跨平台操作。

获取内存使用情况

!/usr/bin/env Python
from __future__ import print_function
from collections import OrderedDict
def meminfo():
''' Return the information in /proc/meminfo
as a dictionary '''
meminfo=OrderedDict()
with open('/proc/meminfo') as f:
for line in f:
meminfo[line.split(':')[0]] = line.split(':')[1].strip()
return meminfo
if __name__=='__main__':
#print(meminfo())
meminfo = meminfo()
print('Total memory: {0}'.format(meminfo['MemTotal']))
print('Free memory: {0}'.format(meminfo['MemFree']))

net.py 获取网络接口的输入和输出

   

#!/usr/bin/env Python
  import time
  import sys
  if len(sys.argv) > 1:
    INTERFACE = sys.argv[1]
  else:
    INTERFACE = 'eth0'
  STATS = []
  print 'Interface:',INTERFACE
  def rx():
    ifstat = open('/proc/net/dev').readlines()
    for interface in ifstat:
      if INTERFACE in interface:
        stat = float(interface.split()[1])
        STATS[0:] = [stat]
  def tx():
    ifstat = open('/proc/net/dev').readlines()
    for interface in ifstat:
      if INTERFACE in interface:
        stat = float(interface.split()[9])
        STATS[1:] = [stat]
  print  'In     Out'
  rx()
  tx()
  while  True:
    time.sleep(1)
    rxstat_o = list(STATS)
    rx()
    tx()
    RX = float(STATS[0])
    RX_O = rxstat_o[0]
    TX = float(STATS[1])
    TX_O = rxstat_o[1]
    RX_RATE = round((RX - RX_O)/1024/1024,3)
    TX_RATE = round((TX - TX_O)/1024/1024,3)
    print RX_RATE ,'MB   ',TX_RATE ,'MB'

crtrl.py 监控 Apache 服务器进程的 Python 脚本

#!/usr/bin/env Python 
import os, sys, time 
while True: 
time.sleep(4) 
try: 
ret = os.popen('ps -C apache -o pid,cmd').readlines() 
if len(ret) < 2: 
print "apache 进程异常退出, 4 秒后重新启动" 
time.sleep(3) 
os.system("service apache2 restart") 
except: 
print "Error", sys.exc_info()[1]

总结

以上所述是小编给大家介绍的Python实现Linux监控的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
玩转python爬虫之cookie使用方法
Feb 17 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
Python 3.8 新功能全解
Jul 25 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
Python input函数使用实例解析
Nov 22 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
带你学习Python如何实现回归树模型
Jul 16 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 #Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 #Python
Python实现的文轩网爬虫完整示例
May 16 #Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 #Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 #Python
详解Python传入参数的几种方法
May 16 #Python
[机器视觉]使用python自动识别验证码详解
May 16 #Python
You might like
PHP页面实现定时跳转的方法
2014/10/31 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
php获取excel文件数据
2017/04/21 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
4个顶级开源JavaScript图表库
2018/09/29 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
vue的keep-alive用法技巧
2019/08/15 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Python中单例模式总结
2018/02/20 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
以权谋私检举信范文
2015/03/02 职场文书
社区党务工作总结2015
2015/05/19 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL