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

用 Python 脚本实现对 Linux 服务器的监控,第1张

概述版本说明Linux服务器是Ubuntu12.10Python版本是2.7工作原理:基于/proc文件系统Linux系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc虚拟文件系统实现的。/proc文件虚拟系统是一种内核和内核模块用来向进程(process)发送

版本说明

linux 服务器是 Ubuntu 12.10

Python 版本 是 2.7

工作原理:基于/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 目录中的主要文件的说明:

表 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 名称 cpu1.py,作用获取 cpu 的信息。

清单 1.获取 cpu 的信息

#!/usr/bin/env 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

# Python cpu1.py

Intel(R) Celeron(R) cpu E3200  @ 2.40GHz

图 1.运行清单 1

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

#chmod +x cpu1.py

# ./cpu1.py

对于系统负载监测

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

清单 2 获取系统的负载信息

#!/usr/bin/env 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:清单 2 读取/proc/loadavg 中的信息,import os :Python 中 import 用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import 模块名 [as 别名],如果只需要导入模块中的部分或全部内容可以用形式:from 模块名 import *来导入相应的模块。OS 模块 os 模块提供了一个统一的 *** 作系统接口函数,os 模块能在不同 *** 作系统平台如 nt,posix 中的特定函数间自动切换,从而实现跨平台 *** 作。

可以使用 Python 命令运行脚本 cpu1.py 结果见图 2 # Python cpu2.py

图 2.运行清单 2

对于内存信息的获取

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

清单 3 获取内存使用情况

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

可以使用 Python 命令运行脚本 mem.py 结果见图 3。 # Python mem.py

图 3.运行清单 3


#!/usr/bin/env 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:清单 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 结果见图 4 #Python net.py

图 4.运行清单 4


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

Apache 服务器进程可能会因为系统各种原因而出现异常退出,导致 Web 服务暂停。所以笔者写一个 Python 脚本文件:

清单 5 crtrl.py 监控 Apache 服务器进程的 Python 脚本

#!/usr/bin/env 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 crtrl.py),然后加入到/etc/rc.local 即可,一旦 Apache 服务器进程异常退出,该脚本自动检查并且重启。 简单说明一下清单 5 这个脚本不是基于/proc 伪文件系统的,是基于 Python 自己提供的一些模块来实现的 。这里使用的是 Python 的内嵌 time 模板,time 模块提供各种 *** 作时间的函数。

总结

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

总结

以上是内存溢出为你收集整理的用 Python 脚本实现对 Linux 服务器的监控全部内容,希望文章能够帮你解决用 Python 脚本实现对 Linux 服务器的监控所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1187715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存