您的位置:首页 > 运维架构 > Linux

Python 脚本实现对 Linux 服务器的监控

2016-08-17 16:07 706 查看
本文来自我的githubpages博客http://galengao.github.io/即www.gaohuirong.cn

摘要:

原文地址

由于原文来自微信公众号,并且脚本都是图片,所以这里自己亲自把代码整理执行一遍

工作原理:基于/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设备信息
scsiscsi设备信息
self到查看/proc程序进程目录的符号链接
stat包含CPU利用率,内存页、内存兑换、磁盘,全部中断,接触开关自举时间
swaps交换分区的使用情况
uptime给出系统自从上次自举以来的秒数,以及有多少秒处于空闲
version这个文件只有一行内容,说明运行内核版本

Python脚本对linux服务器的监控

对于CPU的监控

获取CPU信息

脚本

#!/usr/bin/envpython

from__future__importprint_function
fromcollectionsimportOrderedDict
importpprint

defCPUinfo():
'''Returntheinformatonin/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'])


结果

[root@cdtest~]#pythoncpu.py

Intel(R)Xeon(R)CPUE5-2620v3@2.40GHz
Intel(R)Xeon(R)CPUE5-2620v3@2.40GHz


对于系统负载的监控

获取负载信息

脚本

#!/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'])


结果

[root@cdtest~]#pythoncpu2.py

('loadavg','0.00')


对于系统内存的监控

获取内存信息

脚本

#!/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__':
meminfo=meminfo()
print('Totalmemory:{0}'.format(meminfo['MemTotal']))
print('Freememory:{0}'.format(meminfo['MemFree']))


结果

[root@cdtest~]#pythoncpu3.py

Totalmemory:3925652kB
Freememory:2999584kB


对于网络接口的监控

获取网络信息

脚本

#!/usr/bin/envpython

importtime
importsys

iflen(sys.argv)>1:
INTERFACE=sys.argc[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)
print(RX_RATE,'MB',TX_RATE,'MB')


结果

[root@cdtest~]#pythoncpu4.py

('Interface:','eth0')
InOut
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.002,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')
(0.0,'MB',0.0,'MB')


对于系统某进程的监控

获取进程信息

脚本

#!/usr/bin/envpython

importos,sys,time

whileTrue:
time.sleep(4)
try:
ret=os.popen('ps-Capache-opid,cmd').readlines()
iflen(ret)<2:
print("apacheexit,4srestart")
time.sleep(3)
os.system("serviceapacherestart")
except:
print("error")




结果该结果要系统上有相应的进程才行,可以根据自己需要监控什么进程修改脚本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: