您的位置:首页 > 脚本大全 > > 正文

python实现linux服务(Python实现Linux监控的方法)

更多 时间:2021-09-30 00:29:57 类别:脚本大全 浏览量:2012

python实现linux服务

Python实现Linux监控的方法

工作原理:基于/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  系统识别的分区表

-   pci pci 设备信息

-   scsi    scsi 设备信息

-   self    到查看/proc 程序进程目录的符号连接

-   stat    这个文件包含的信息有 cpu 利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间

-   swaps   显示的是交换分区的使用情况

-   uptime  这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲

-   version 这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息

获取 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
  • #!/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 中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。

    获取系统的负载信息

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • #!/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 中的特定函数间自动切换,从而实现跨平台操作。

    获取内存使用情况

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • !/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']))
  • 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
  • #!/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'
  • crtrl.py 监控 apache 服务器进程的 python 脚本

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • #!/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]
  • 总结

    以上所述是小编给大家介绍的python实现linux监控的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    原文链接:https://www.epubit.com/selfpublish/article/6288

    标签:Python Linux 监控
    您可能感兴趣