Python实现Linux监控的方法
工作原理:基于/proc文件系统
Linux系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc虚拟文件系统实现的。/proc文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(onthefly)改变设置(通过改变内核参数)。与其他文件系统不同,/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 系统识别的分区表
- pcipci设备信息
- scsi scsi设备信息
- self 到查看/proc程序进程目录的符号连接
- stat 这个文件包含的信息有CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间
- swaps 显示的是交换分区的使用情况
- uptime 这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲
- version这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息
获取CPU的信息
#!/usr/bin/envPython
from__future__importprint_function
fromcollectionsimportOrderedDict
importpprint
defCPUinfo():
'''Returntheinformationin/proc/CPUinfo
asadictionaryinthefollowingformat:
CPU_info['proc0']={...}
CPU_info['proc1']={...}
'''
CPUinfo=OrderedDict()
procinfo=OrderedDict()
nprocs=0
withopen('/proc/CPUinfo')asf:
forlineinf:
ifnotline.strip():
#endofoneprocessor
CPUinfo['proc%s'%nprocs]=procinfo
nprocs=nprocs+1
#Reset
procinfo=OrderedDict()
else:
iflen(line.split(':'))==2:
procinfo[line.split(':')[0].strip()]=line.split(':')[1].strip()
else:
procinfo[line.split(':')[0].strip()]=''
returnCPUinfo
if__name__=='__main__':
CPUinfo=CPUinfo()
forprocessorinCPUinfo.keys():
print(CPUinfo[processor]['modelname'])
简单说明一下清单1,读取/proc/CPUinfo中的信息,返回list,每核心一个dict。其中list是一个使用方括号括起来的有序元素集合。List可以作为以0下标开始的数组。Dict是Python的内置数据类型之一,它定义了键和值之间一对一的关系。OrderedDict是一个字典子类,可以记住其内容增加的顺序。常规dict并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。在OrderedDict中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。
获取系统的负载信息
#!/usr/bin/envPython
importos
defload_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]
returnloadavg
print"loadavg",load_stat()['lavg_15']
简单说明一下清单2:清单2读取/proc/loadavg中的信息,importos:Python中import用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import模块名[as别名],如果只需要导入模块中的部分或全部内容可以用形式:from模块名import*来导入相应的模块。OS模块os模块提供了一个统一的操作系统接口函数,os模块能在不同操作系统平台如nt,posix中的特定函数间自动切换,从而实现跨平台操作。
获取内存使用情况
!/usr/bin/envPython
from__future__importprint_function
fromcollectionsimportOrderedDict
defmeminfo():
'''Returntheinformationin/proc/meminfo
asadictionary'''
meminfo=OrderedDict()
withopen('/proc/meminfo')asf:
forlineinf:
meminfo[line.split(':')[0]]=line.split(':')[1].strip()
returnmeminfo
if__name__=='__main__':
#print(meminfo())
meminfo=meminfo()
print('Totalmemory:{0}'.format(meminfo['MemTotal']))
print('Freememory:{0}'.format(meminfo['MemFree']))
net.py获取网络接口的输入和输出
#!/usr/bin/envPython
importtime
importsys
iflen(sys.argv)>1:
INTERFACE=sys.argv[1]
else:
INTERFACE='eth0'
STATS=[]
print'Interface:',INTERFACE
defrx():
ifstat=open('/proc/net/dev').readlines()
forinterfaceinifstat:
ifINTERFACEininterface:
stat=float(interface.split()[1])
STATS[0:]=[stat]
deftx():
ifstat=open('/proc/net/dev').readlines()
forinterfaceinifstat:
ifINTERFACEininterface:
stat=float(interface.split()[9])
STATS[1:]=[stat]
print'InOut'
rx()
tx()
whileTrue:
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)
printRX_RATE,'MB',TX_RATE,'MB'
crtrl.py监控Apache服务器进程的Python脚本
#!/usr/bin/envPython
importos,sys,time
whileTrue:
time.sleep(4)
try:
ret=os.popen('ps-Capache-opid,cmd').readlines()
iflen(ret)<2:
print"apache进程异常退出,4秒后重新启动"
time.sleep(3)
os.system("serviceapache2restart")
except:
print"Error",sys.exc_info()[1]
总结
以上所述是小编给大家介绍的Python实现Linux监控的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!