一、前言

二、概述

三、Python 版本说明

四、/proc 文件系统

五、对CPU监测

六、对系统负载监测

七、对内存信息的获取

八、对网络接口的监测

九、监控apache服务器进程的Python脚本

十、总结

注,测试环境 CentOS 6.4 x86_64,Python 版本 Python 2.6.6。

一、前言

原文链接:http://www.ibm.com/developerworks/cn/linux/1312_caojh_pythonlinux/#icomments

作者:曹江华

简介:毕业于工科大学机电一体化专业,从事 CAD 设计。后从事小型数据库的应用。1999 年开始从事构建网络、管理维护、数据库管理工作。关注开放系统和网络安全。出版多本 Unix/Linux 安全管理书籍。

注,原文是测试环境是ubuntu 12.10,本文在原文的基础上进行相关测试与修改,本文的测试环境是CentOS 6.4 x86_64。

二、概述

目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件)、 glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控。 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写。

三、Python 版本说明

Python 是由 Guido van Rossum 开发的、可免费获得的、非常高级的解释型语言。其语法简单易懂,而其面向对象的语义功能强大(但又灵活)。Python 可以广泛使用并具有高度的可移植性。本文 Linux 服务器是 CentOS 6.4 x86_64, Python 版本 是 2.6.6 。如果是 Python 3.0 版本的语法上有一定的出入。另外这里笔者所说的 Python 是 CPython,CPython 是用 C 语言实现的 Python 解释器,也是官方的并且是最广泛使用的 Python 解释器。除了 CPython 以外,还有用 Java 实现的 Jython 和用.NET 实现的 IronPython,使 Python 方便地和 Java 程序、.NET 程序集成。另外还有一些实验性的 Python 解释器比如 PyPy。CPython 是使用字节码的解释器,任何程序源代码在执行之前先要编译成字节码。它还有和几种其它语言(包括 C 语言)交互的外部函数接口。

四、/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 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等。

表 1 /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 显示的是交换分区的使用情况
uptime 这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲
version 这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息

注,下面本文的几个例子都是使用 Python 脚本读取/proc 目录中的主要文件来实现实现对 Linux 服务器的监控的 。

五、对CPU监测

注,脚本1名称 cpu1.py,作用获取 CPU 的信息。

具体内容如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@node6 py]# cat cpu1.py  
#!/usr/bin/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。其中 list 是一个使用方括号括起来的有序元素集合。List 可以作为以 0 下标开始的数组。Dict 是 Python 的内置数据类型之一, 它定义了键和值之间一对一的关系。OrderedDict 是一个字典子类,可以记住其内容增加的顺序。常规 dict 并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。在 OrderedDict 中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。

可以使用 Python 命令运行脚本 cpu1.py 结果如下,

1
2
3
[root@node6 py]# python cpu1.py  
Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz  
Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz

也可以使用 chmod 命令添加权限收直接运行 cpu1.py结果如下,

1
2
3
4
[root@node6 py]# chmod +x cpu1.py  
[root@node6 py]# ./cpu1.py   
Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz  
Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz

六、对系统负载监测

注,脚本 2 名称 cpu2.py,作用获取系统的负载信息。

具体内容如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node6 py]# cat cpu2.py  
#!/usr/bin/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 中的信息,import os :Python 中 import 用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import 模块名 [as 别名],如果只需要导入模块中的部分或全部内容可以用形式:from 模块名 import *来导入相应的模块。OS 模块 os 模块提供了一个统一的操作系统接口函数,os 模块能在不同操作系统平台如 nt,posix 中的特定函数间自动切换,从而实现跨平台操作。

可以使用 Python 命令运行脚本 cpu2.py 结果如下,

1
2
[root@node6 py]# python cpu2.py  
loadavg 0.10

七、对内存信息的获取

注,脚本 3 名称 mem.py,作用是获取内存使用情况信息。

具体内容如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@node6 py]# cat mem.py  
#!/usr/bin/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']))

简单说明一下脚本 3:读取 proc/meminfo 中的信息,Python 字符串的 split 方法是用的频率还是比较多的。比如我们需要存储一个很长的数据,并且按照有结构的方法存储,方便以后取数据进行处理。当然可以用 json 的形式。但是也可以把数据存储到一个字段里面,然后有某种标示符来分割。 Python 中的 strip 用于去除字符串的首位字符,最后清单 3 打印出内存总数和空闲数。

可以使用 Python 命令运行脚本 mem.py 结果如下,

1
2
3
[root@node6 py]# python mem.py  
Total memory: 236380 kB  
Free memory: 84404 kB

八、对网络接口的监测

注,脚本 4 名称是 net.py,作用获取网络接口的使用情况。

具体内容如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@node6 py]# cat net.py  
#!/usr/bin/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'

简单说明一下脚本 4:读取/proc/net/dev 中的信息,Python 中文件操作可以通过 open 函数,这的确很像 C 语言中的 fopen。通过 open 函数获取一个 file object,然后调用 read(),write()等方法对文件进行读写操作。另外 Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。最后清单 4 打印出网络接口的输入和输出情况。

可以使用 Python 命令运行脚本 net.py 结果如下,

1
2
3
4
5
6
7
8
9
10
[root@node6 py]# python net.py  
Interface: eth0  
In        Out  
0.3 MB        0.1 MB  
0.4 MB        0.2 MB  
0.2 MB        0.1 MB  
0.6 MB        0.3 MB  
0.5 MB        0.2 MB  
0.9 MB        0.5 MB  
0.7 MB        0.3 MB

九、监控Apache服务器进程的Python脚本

注,脚本 5 apache.py 监控 Apache 服务器进程的 Python 脚本。

具体内容如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node6 py]# cat apache.py
#!/usr/bin/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]

设置文件权限为执行属性(使用命令 chmod +x apache.py),然后加入到/etc/rc.local 即可,一旦 Apache 服务器进程异常退出,该脚本自动检查并且重启。 简单说明一下脚本 5 这个脚本不是基于/proc 伪文件系统的,是基于 Python 自己提供的一些模块来实现的 。这里使用的是 Python 的内嵌 time 模板,time 模块提供各种操作时间的函数。

十、总结

在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控。本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 、系统负载、内存和 网络使用情况的监控脚本的编写方法。

最后,希望大家有所收获^_^……

本文转自陈明乾51CTO博客,原文链接:http://blog.51cto.com/freeloda/1348382,如需转载请自行联系原作者

用Python脚本实现对Linux服务器的监控相关推荐

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

    版本说明 Linux 服务器是 Ubuntu 12.10 Python 版本 是 2.7 工作原理:基于/proc 文件系统 Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核, ...

  2. Python脚本,物联网云服务器端口监控

    事实上,物联网的思路很简单,客户端设备通过TCP协议上传到某个云服务器的端口,我们需要在这个云服务器上编写一个小小的脚本去创建某个端口,持续监听,可以互相发送数据,这个脚本语言可以是JAVA,也可以是 ...

  3. java远程关机_通过jsch实现对linux服务器的shell客户端远程控制关机完整示例代码分享...

    一.前言 由于前些阵子想找个ssh客户端 for android实现在手机上可以远程控制Centos服务器实现在手机上远程关机操作,找了一圈没有合适的,因此自己想通过linux的客户端接入包jsch实 ...

  4. nginx两台文件服务器集群,keepalived结合nginx状态检测脚本实现对web服务器集群的高可用...

    实验环境 两台CentOS-7.5虚拟机 web1:10.0.11.203 web2:10.0.11.204 VIP :10.0.11.210 web类型:nginx 客户端:自用笔记本(win10) ...

  5. shell脚本如何实现goto_linux通过shell脚本实现对apache服务的监控

    假设有一个业务需求:每隔2分钟, 判断当前Apache服务是否启动,如果启动则不执行任何操作,如果没有启动则开启Apache服务. 1,启动apache 2, 查看apache进程 结论: 如果apa ...

  6. CV之FDFA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准

    CV之FD&FA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准 目录 运行结果 运行过程 运行(部分)代码 在裁剪好的LFW数据集进行验证 运行结果 运行过程 time ...

  7. 树莓派定时运行python程序_定时发送免费天气预报(邮件)短信通知的Python脚本,通用Linux,也适合树莓派...

    最近在摆弄Python和树莓派,故写了个定时发送免费天气预报(邮件)短信通知的Python脚本,通用Linux,也适合树莓派或者Windows系统,为Python3版本,Python2环境下使用的话, ...

  8. linux 跟踪程序执行过程,用pvtrace和Graphviz实现对linux下C程序的函数调用跟踪

    用pvtrace和Graphviz实现对linux下C程序的函数调用跟踪 用pvtrace和Graphviz实现对linux下C程序的函数调用跟踪 1:功能介绍,使用本方法可以实现linux下C应用程 ...

  9. Python(+numpy)实现对9*9数独问题(单解或多解)的快速递归求解

    Python(+numpy)实现对9*9数独问题的求解 利用Python(+numpy库)递归实现对9*9数独问题的求解 (=== 分享一下这两天断断续续写的解9*9数独问题的经历及源码,第一次写博客 ...

最新文章

  1. 大型网站系统架构系列:分布式消息队列(二)
  2. 在线绘图|2分钟轻松搞定桑基图(Sankey diagrams)
  3. 10.Ubuntu下的source insight增加使用期限90天
  4. 【Android 电量优化】电量优化 ( 获取电量分析报告 | 阿里云服务器搭建 Battery Historian | 上传并生成分析报告 )
  5. SQLAlchemy之SQL Expression
  6. python前后端分离前端权限_Linux上搭建前后端分离项目
  7. js json制表符报错_JS自学_常见错误复盘
  8. [读书笔记] 两则之一: 100Gbps传输
  9. c 语言中浮点数舍入,浮点数在C中舍入,我不明白为什么
  10. 如何检查某个用户是否具有某个权限对象上定义的某种权限
  11. 860. 柠檬水找零 golang
  12. 一个很详细的web.xml讲解(转)
  13. 朱艳梅Java_基于CNKI的大学Java程序设计教学改革文献计量分析
  14. python将输出结果写入csv_Python怎么把输出整体写入CSV文件
  15. MySQL 8.0 OCP 1Z0-908认证考试题库1
  16. tar.bz2 解压命令
  17. xtreme toolkit pro——CXTPReportControl控件教程
  18. 优酷动漫押注“新国风”,能否追回被B站、腾讯赶超的那些年?
  19. 算法分析之常用符号大O、小o、大Ω符号、大Θ符号、w符号
  20. 周末参加“北京干部管理职业技术学院”关于高职课程改革的专家讨论会

热门文章

  1. 《后端架构师技术图谱》
  2. 计算机毕业设计(附源码)python医院门诊分诊系统
  3. 1.3 matlab与LINGO编程
  4. 反射Field类的学习
  5. java中怎么定义true或false_为什么Java中的布尔值只接受true或false? 为什么也不要1或0?...
  6. 塔里木大学有没有计算机专业,塔里木大学最好的专业(什么专业最好)
  7. okhttp 服务器性能,okHttp小结
  8. idea设置放大缩小_苹果手机连按3下,能打开隐藏放大镜功能,看什么都一清二楚...
  9. two-stage-anchor-based-faster-rcnn进阶-mask rcnn:Mask R-CNN
  10. 85人教版高中英语第一册第十四课 WATCHING ANTS