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的web框架中中编写日志列表的教程
Apr 30 Python
详解Python中的strftime()方法的使用
May 22 Python
python选择排序算法实例总结
Jul 01 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
Python 操作文件的基本方法总结
Aug 10 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
python实现反转部分单向链表
Sep 27 Python
python交易记录链的实现过程详解
Jul 03 Python
python之array赋值技巧分享
Nov 28 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 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数组去重的函数代码
2013/02/03 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
jsonp原理及使用
2013/10/28 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
详解jQuery选择器
2016/12/21 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
python插入排序算法的实现代码
2013/11/21 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
python解包概念及实例
2021/02/17 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
音乐教学反思
2014/02/02 职场文书
医学生求职自荐书
2014/06/12 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏