用 Python 脚本实现对 Linux 服务器的监控_第1页
用 Python 脚本实现对 Linux 服务器的监控_第2页
用 Python 脚本实现对 Linux 服务器的监控_第3页
用 Python 脚本实现对 Linux 服务器的监控_第4页
用 Python 脚本实现对 Linux 服务器的监控_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用Python脚本实现对Linux服务器III目前Linux下有一些使用Python语言编写的Linux系统监控工具比如inotify-syn6文件系统安全监控软件)、glances(资源监控工具)在实际工作中,Linux系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对Linux服务器的监控。本文介绍一下使用Python脚本实现对Linux服务器CPU内存网络的监控脚本的编写。A评论:曹江华,系统管理员,中科思密达有限公司2013年12月23日内容Python版本说明Python是由GuidovanRossum开发的、可免费获得的、非常高级的解释型语言。其语法简单易懂,而其面向对象的语义功能强大(但又灵活)。Python可以广泛使用并具有高度的可移植性。本文Linux服务器是Ubuntu12.10,Python版本是2.7。如果是Python3.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”这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(onthefly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc存在于内存而不是硬盘中。proc文件系统提供的信息如下:.进程信息:系统中的任何一个进程,在proc的子目录中都有一个同名的进程ID,可以找到cmdline、mem、root、stat、statm,以及statuso某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。.系统信息:如果需要了解整个系统信息中也可以从/proc/stat中获得,其中包括CPU占用情况、磁盘空间、内存对换、中断等。.CPU信息:利用/proc/CPUinfo文件可以获得中央处理器的当前准确信息。•负载信息:/proc/loadavg文件包含系统负载信息。.系统内存信息:/proc/meminfo文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等。表1是/proc目录中的主要文件的说明:表1/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脚本读取/proc目录中的主要文件来实现实现对Linux服务器的监控的。使用Python脚本实现对Linux服务器的监控对于CPU(中央处理器)监测脚本1名称CPUl.py,作用获取CPU的信息。清单1.获取CPU的信息#!/usr/bin/envPythonfrom__future—importprint_functionfromcollectionsimportOrderedDictimportpprintdefCPUinfo():'''Returntheinformationin/proc/CPUinfoasadictionaryinthefollowingformat:CPU_info['proc0']={...}CPU_info['proc1']={...}'''CPUinfo=OrderedDict()procinfo=OrderedDict()nprocs=0withopen('/proc/CPUinfo')asf:forlineinf:ifnotline.strip():endofoneprocessorCPUinfo['proc%s'%nprocs]=procinfonprocs=nprocs+1Resetprocinfo=OrderedDict()else:iflen(line.split(':'))==2:procinfo[line.split(':')[0].strip=)line.split(':')[1].strip()else:procinfo[line.split(':')[0].strip()]=''returnCPUinfoif—name—=='―main__':CPUinfo=CPUinfo()forprocessorinCPUinfo.keys():print(CPUinfo[processor]['modelname'])简单说明一下清单1,读取/proc/CPUinfo中的信息,返回list,每核心一个diet。其中list是一个使用方括号括起来的有序元素集合。List可以作为以0下标开始的数组。Diet是Python的内置数据类型之一,它定义了键和值之间一对一的关系°OrderedDict是一个字典子类,可以记住其内容增加的顺序。常规diet并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。在OrderedDict中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。可以使用Python命令运行脚本CPUl.py结果见图1#PythonCPUl.pylntel(R)Celeron(R)图1.运行清单1等。伺root@))c-VirtuaLBoxi«/11rootgx-VirtualBox:-/11#pythoncpul.pyIntel(R)Celer&nCR)CPUE3200@2*40GHzIntel(R)CeleronCR)CPUE3200@2.40GHzrootgx-VtrtualBox:~/ll#|也可以使用chmod命令添加权限收直接运行CPUl.py#chmod+xCPUl.py#./CPUl.py对于系统负载监测脚本2名称CPU2.py,作用获取系统的负载信息清单2获取系统的负载信息#!/usr/bin/envPythonimportosdefload_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]returnloadavgprint"loadavg",loadstat()['lavg15']简单说明一下清单2:清单2读取/proc/loadavg中的信息,importos:Python中import用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import模块名[as别名],如果只需要导入模块中的部分或全部内容可以用形式:from模块名import*来导入相应的模块。OS模块os模块提供了一个统一的操作系统接口函数,os模块能在不同操作系统平台如nt,posix中的特定函数间自动切换,从而实现跨平台操作。可以使用Python命令运行脚本CPU1.py结果见图2#PythonCPU2.py图2.运行清单2root@}x-vrrtualBox:刁11(于x-VFrtualBox]rootgx-VtrtuaLBox:~/llffpythoncpuZ.pyloadavg9.27root@x-VtrtuaLBox:™/11#|对于内存信息的获取脚本3名称mem.py,作用是获取内存使用情况信息清单3获取内存使用情况#!/usr/bin/envPythonfrom__future—importprint_functionfromcollectionsimportOrderedDictdefmeminfo():'''Returntheinformationin/proc/meminfoasadictionary'''meminfo=OrderedDict()withopen('/proc/meminfo')asf:forlineinf:meminfo[line.split(':')[0]]=line.split(':')[1].strip()returnmeminfoif—name—=='―main__':#print(meminfo())meminfo=meminfo()print('Totalmemory:{0}'.format(meminfo['MemTotal']))print('Freememory:{0}'.format(meminfo['MemFree']))简单说明一下清单3:清单3读取proc/meminfo中的信息,Python字符串的split方法是用的频率还是比较多的。比如我们需要存储一个很长的数据,并且按照有结构的方法存储,方便以后取数据进行处理。当然可以用json的形式。但是也可以把数据存储到一个字段里面,然后有某种标示符来分割。Python中的strip用于去除字符串的首位字符,最后清单3打印出内存总数和空闲数。可以使用Python命令运行脚本mem.py结果见图3。#Pythonmem.py图3.运行清单3root^x-VktualBox:root^x-VirtuaLBox:-/llfipythonnen.pyTotalnenory:1019364kBFreememory:398908kB对于网络接口的监测脚本4名称是net.py,作用获取网络接口的使用情况。清单4net.py获取网络接口的输入和输出#!/usr/bin/envPythonimporttimeimportsysiflen(sys.argv)>1:INTERFACE=sys.argv[1]else:INTERFACE='eth0'STATS=口print'Interface:',INTERFACEdefrx():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)printRXRATE,'MB',TXRATE,'MB简单说明一下清单4:清单4读取/proc/net/dev中的信息,Python中文件操作可以通过open函数,这的确很像C语言中的fopen。通过open函数获取一个fileobject,然后调用read(),write()等方法对文件进行读写操作。另外Python将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法:read()、readline()和readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。.read()每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而.read()生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。.readline()和.readlines()之间的差异是后者一次读取整个文件,象.read()一样。.readlines()自动将文件内容分析成一个行的列表,该列表可以由Python的for...in...结构进行处理。另一方面,.readline()每次只读取一行,通常比.readlines()慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用.readline()。最后清单4打印出网络接口的输入和输出情况。可以使用Python命令运行脚本net.py结果见图4#Pythonnet.py图4.运行清单4root@x-VLrtualBox:~/ll#pythonnet.pyInterface;eth&In3.2443.027root@x-VLrtualBox:~/ll#pythonnet.pyInterface;eth&In3.2443.027I3.965i2.9MB4.322i2.895i3.356i4.465iMBMBMBMBMBMBMB0.45MB0.0MB0.0MB0.0MB0.0MBOut9.0729.9690.089MBMBMB0.068MB9.99

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论