Python实现Linux系统监控:基于/proc文件系统的实战指南

小满
小满
发布时间:2026-10-13 | 6人浏览过
原创

本文详细介绍如何利用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 系统监控的方法,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表