python实现linux服务(Python实现Linux监控的方法)
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 的信息
|
#!/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 中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。
获取系统的负载信息
|
#!/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 中的特定函数间自动切换,从而实现跨平台操作。
获取内存使用情况
|
! / 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 获取网络接口的输入和输出
|
#!/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 脚本
|
#!/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排列组合计算方法(Python实现的排列组合、破解密码算法示例)
- 如何对python中列表中的数据运算(Python3.5集合及其常见运算实例详解)
- python改变字体颜色指令(使用Python自动化破解自定义字体混淆信息的方法实例)
- python面向对象编写案例(Python面向对象程序设计示例小结)
- python网络爬虫案例实战(python爬取cnvd漏洞库信息的实例)
- python怎么装opencv(Python基于opencv实现的简单画板功能示例)
- python创建列表并查询(python列表使用实现名字管理系统)
- python模块学习之random模块(详解Python基础random模块随机数的生成)
- python format的用法(Python中format格式输出全解)
- python编写的小程序(几个适合python初学者的简单小程序,看完受益匪浅!推荐)
- python数字形式转换详解(Python3.5实现的罗马数字转换成整数功能示例)
- python为什么要用多进程(对Python的多进程锁的使用方法详解)
- python怎么设置matlab编程(实例详解Matlab 与 Python 的区别)
- python 从入门到实践笔记(python基础梳理一推荐)
- 如何学会python多线程(Python3多线程基础知识点)
- python如何遍历列表并提取(Python同步遍历多个列表的示例)
- 《金陵秘事》的剧情跌宕起伏 给观众带来的怎样的感官体验(金陵秘事的剧情跌宕起伏)
- 少儿口才表达影响未来一生,50首经典绕口令和孩子玩出聪明大脑(少儿口才表达影响未来一生)
- 玩网游居然让人更友善 很难以让人置信(玩网游居然让人更友善)
- 学好汉语拼音,从娃娃绕口令抓起,平时还是要多练 收藏好(从娃娃绕口令抓起)
- 仙女们的私藏鲜法大PK 鲜香切块牛肉(仙女们的私藏鲜法大PK)
- 天热没胃口 这道菜开胃又下饭,2个小技巧新手一学就会(这道菜开胃又下饭)
热门推荐
- dede后台建栏目(DedeEIMS后台栏目模板含单独页模板修改方法)
- python函数大全详细(详解Python函数式编程—高阶函数)
- SQL SERVER数据类型对应C#的数据类型
- js字符串常用函数
- SQL中的CONVERT()函数
- python分词操作(Python英文文本分词无空格模块wordninja的使用实例)
- php数组是怎么实现的(PHP里的$_GET数组介绍)
- dedecms频道封面不能修改内容(dedecms按栏目名首字母/数字排序输出的实现方法)
- 如何找到mysqlroot密码(WDCP管理面板忘记MYSQL ROOT密码及重置后台登录密码的方法汇总)
- mysql8.0关键字段使用(MySQL 8.0新特性之隐藏字段的深入讲解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9