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 相关文章推荐
web.py在模板中输出美元符号的方法
Aug 26 Python
Python生成器以及应用实例解析
Feb 08 Python
Flask之flask-script模块使用
Jul 26 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
python之消除前缀重命名的方法
Oct 21 Python
Python实现简单的列表冒泡排序和反转列表操作示例
Jul 10 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
python多进程并行代码实例
Sep 30 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
Python 如何调试程序崩溃错误
Aug 03 Python
通过案例解析python鸭子类型相关原理
Oct 10 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 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/01/14 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
Vue程序调试的方法
2019/06/17 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Linux下Python获取IP地址的代码
2014/11/30 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
Form表单及django的form表单的补充
2019/07/25 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
学生干部的自我评价分享
2014/01/18 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
吴仁宝观后感
2015/06/09 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
golang正则之命名分组方式
2021/04/25 Golang
Django如何创作一个简单的最小程序
2021/05/12 Python