Python实现Linux系统监控:基于/proc文件系统的实战指南
本文详细介绍如何利用Python脚本读取Linux的/proc虚拟文件系统,实现CPU、内存、负载及网络接口的实时监控。通过解析/proc/cpuinfo、/proc/meminfo、/proc/loadavg等关键文件,结合OrderedDict数据结构,提供完整的代码示例,帮助开发者快速掌握Linux系统状态监控的核心方法。
Linux /proc 文件系统原理
工作原理:基于/proc 文件系统
Linux 系统为管理员提供了极佳的机制,允许在系统运行时动态修改内核参数,而无需重启系统。这一功能主要通过 /proc 虚拟文件系统实现。/proc 是一种伪文件系统,它是内核及内核模块向进程发送信息的接口(名称即源于此)。通过该文件系统,用户可以与内核内部数据结构进行交互,获取进程相关信息,并在运行时动态调整设置(即修改内核参数)。与常规文件系统不同,/proc 完全驻留在内存中,而非硬盘上。/proc 文件系统主要提供以下几类信息:
进程信息:系统中的每个进程在 /proc 的子目录下都有一个与其进程 ID(PID)同名的目录。在这些目录中,可以找到 cmdline、mem、root、stat、statm 以及 status 等文件。部分信息(如进程根目录)仅对超级用户可见。每个包含进程信息的目录还包含指向该进程信息的符号链接,可用于从进程中提取命令行参数等详细信息。
系统信息:若需了解整个系统的综合状态,可查阅 /proc/stat 文件。该文件包含了 CPU 占用率、磁盘空间使用情况、内存交换情况以及中断统计等关键系统指标。
CPU 信息:通过读取 /proc/cpuinfo 文件,可以获取中央处理器(CPU)的当前详细配置与状态信息。
负载信息:/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 显示交换分区(Swap)的使用情况
- uptime 记录自上次系统启动以来的总秒数,以及其中处于空闲状态的秒数
- version 仅包含一行内容,说明当前运行的内核版本号。可通过标准编程方法解析该文件以获取所需的系统版本信息
Python 监控 CPU 信息
获取 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)。在 Python 中,List 是由方括号括起来的有序元素集合,可作为从 0 开始索引的数组使用。Dict 是 Python 的内置数据类型,定义了键(key)与值(value)之间的一对一映射关系。OrderedDict 是 dict 的子类,它能够记住内容插入的顺序。常规的 dict 不跟踪插入顺序,迭代时依据键在哈希表中的存储顺序生成值;而 OrderedDict 则相反,它保留元素的插入顺序,并在创建迭代器时遵循该顺序。
Python 监控系统负载
获取系统的负载信息
#!/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 的代码逻辑:该代码读取 /proc/loadavg 文件的内容。在 Python 中,import 语句用于导入模块,包括系统内置模块和自定义模块。基本语法为:import 模块名 [as 别名];若只需导入模块中的部分或全部内容,可使用形式:from 模块名 import *。OS 模块(os)提供了统一的操作系统接口函数,能够在不同操作系统平台(如 nt、posix)的特定函数间自动切换,从而实现跨平台操作。
Python 监控内存与网络
获取内存使用情况
!/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'
Python 监控 Apache 进程
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 系统监控的方法,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









