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

摘要:
/usr/bin/envpythonfrom__future__importprint_functionfromcollectionsimportOrderedDictimportpprintdefCPUinfo():'''Returntheinformatonin/proc/CPUinfoasadictionaryinthefollowingformat:CPU_info['proc0']={...}CPU_info['proc1']={...}'''CPUinfo=OrderedDict()procinfo=OrderedDict()nprocs=0withopenasf:forlineinf:ifnotline.strip():#endofoneprocessorCPUinfo['proc%s'%nprocs]=procinfonprocs=nprocs+1#resetprocinfo=OrderedDict()else:iflen==2:procinfo[line.split(':')[0].strip()]=line.split(':')[1].strip()else:procinfo[line.split(':')[0].strip()]=''returnCPUinfoif__name__=='__main__':CPUinfo=CPUinfo()forprocessorinCPUinfo.keys():print结果[root@cdtest~]#pythoncpu.pyIntelXeonCPUE5-2620v3@2.40GHzIntelXeonCPUE5-2620v3@2.40GHz对于系统负载的监控获取负载信息脚本#!/usr/bin/envpythonimportosdefload_stat():loadavg={}f=opencon=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]returnloadavgprint结果[root@cdtest~]#pythoncpu2.py对于系统内存的监控获取内存信息脚本#!

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn

摘要:

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

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

Python脚本对linux服务器的监控

对于CPU的监控

获取CPU信息

  • 脚本
#!/usr/bin/env python

from __future__ importprint_function
from collections importOrderedDict
importpprint

defCPUinfo():
    '''Return the informaton 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 inf:
            if notline.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()] = ''
    returnCPUinfo

if __name__=='__main__':
    CPUinfo =CPUinfo()
    for processor inCPUinfo.keys():
        print(CPUinfo[processor]['model name'])
  • 结果
[root@cdtest ~]#python cpu.py   
Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz

对于系统负载的监控

获取负载信息

  • 脚本
#!/usr/bin/env python

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 ~]#python cpu2.py 
('loadavg', '0.00')

对于系统内存的监控

获取内存信息

  • 脚本
#!/usr/bin/env python

from __future__ importprint_function
from collections importOrderedDict

defmeminfo():
    '''Return the information in /proc/meminfo
    as a dictionary '''meminfo=OrderedDict()

    with open('/proc/meminfo') as f:
        for line inf:
            meminfo[line.split(':')[0]] = line.split(':')[1].strip()
    returnmeminfo

if __name__=='__main__':
    meminfo =meminfo()
    print('Total memory:{0}'.format(meminfo['MemTotal']))
    print('Free memory:{0}'.format(meminfo['MemFree']))
  • 结果
[root@cdtest ~]#python cpu3.py   
Total memory:3925652kB
Free memory:2999584 kB

对于网络接口的监控

获取网络信息

  • 脚本
#!/usr/bin/env python

importtime
importsys

if len(sys.argv)>1:
    INTERFACE = sys.argc[1]
else:
    INTERFACE = 'eth0'STATS =[]
print ('Interface:',INTERFACE)

defrx():
    ifstat = open('/proc/net/dev').readlines()
    for interface inifstat:
        if INTERFACE ininterface:
            stat = float(interface.split()[1])
            STATS[0:] =[stat]


deftx():
    ifstat = open('/proc/net/dev').readlines()
    for interface inifstat:
        if INTERFACE ininterface:
            stat = float(interface.split()[9])
            STATS[1:] =[stat]

print ('In        Out')
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 ~]#python cpu4.py 
('Interface:', 'eth0')
In        Out
(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/env python

importos,sys,time

whileTrue:
    time.sleep(4)
    try:
        ret = os.popen('ps -C apache -o pid,cmd').readlines()
        if len(ret) < 2:
            print ("apache exit,4s restart")
            time.sleep(3)
            os.system("service apache restart")
    except:
        print("error")
  • 结果 该结果要系统上有相应的进程才行,可以根据自己需要监控什么进程修改脚本

免责声明:文章转载自《Python 脚本实现对 Linux 服务器的监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# SerialPort自定义串口DCB非线性方程(组):一维非线性方程(一)二分法、不动点迭代、牛顿法 [MATLAB]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python multiprocessing使用详解

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiproc...

linux清理内存命令

  1.清理前内存使用情况 free -m 2.开始清理  echo 1 > /proc/sys/vm/drop_caches3.清理后内存使用情况 free -m4.完成!查看内存条数命令: dmidecode | grep -A16 "Memory Device$" ++++++++++++++++++++++++++++++++++++...

利用python实现TCP和UDP服务器

  利用python的socket模块可以实现基本的网络编程,并且只限于一对一的连接。当然,也可以在其基础上实现一个网络服务器,但由于太底层这种做法不被推荐。其实如果要实现一个网络服务器很简单,调用python的内置模块socketserver就够了。 server类   socketserver模块下面有四种套接字server类:TCPserver, U...

python学习重温(1)自动case生成工具

因为最近工作中,需要设计根据wirshark截获的报文自动产生测试case的小工具,我重温了python。这个笔记,就是根据这个工具的实现,来记录python语法的学习过程。 这个工具的功能如下图所示,其中wirshark cap可以通过wirshark自身的功能导出为pmsl格式,也就是一种XML,同时公司使用的case script也是一种XML,只是...

Python学习————drf(三)

1 请求和响应 1.1 请求 # 请求对象 # from rest_framework.request import Request def __init__(self, request, parsers=None, authenticators=None, negotiator=None, parser_cont...

linux下shell编程示例-获取进程id

今天初步学习了一下linux下的shell编程,简单记录一下测试用例 1.编辑shell脚本文件如下: #!/bin/bashecho "hello bash linux"echo "第0个参数:$0"echo "第一个参数:$1"echo "当前子shell进程:$$" #pidarr=`ps x | awk '{print $1}'`pidarr=$(...