利用Python获取操作系统信息实例

前言

每一位运维人员都应该对自己所管理的机器配置很清楚,因为这对我们快速处理问题很有帮助,比如随着业务增长,突然某些机器负载上涨的厉害,这时候要排查原因,除了从应用程序、架构上分析外,当前硬件性能的分析应该是必不可少的一环,今天我们将不用第三方模块,用python自带模块和系统提供的运行信息来获取我们需要的信息,这个脚本除了硬件外,还抓取了当前系统进程数和网卡流量功能,所以这个版本实现的功能基本对应了之前psutil实现的内容,多的不说了,直接贴代码:

#!/usr/bin/env python

from collections import OrderedDict
from collections import namedtuple
import os
import glob
import re

def cpuinfo():

 cpuinfo=OrderedDict()
 procinfo=OrderedDict()

 nprocs = 0
 with open('/proc/cpuinfo') as f:
 for line in f:
  if not line.strip():

  cpuinfo['proc%s' % nprocs] = procinfo
  nprocs=nprocs+1

  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

def meminfo():

 meminfo=OrderedDict()

 with open('/proc/meminfo') as f:
 for line in f:
  meminfo[line.split(':')[0]] = line.split(':')[1].strip()
 return meminfo

def netdevs():

 with open('/proc/net/dev') as f:
 net_dump = f.readlines()

 device_data={}
 data = namedtuple('data',['rx','tx'])
 for line in net_dump[2:]:
 line = line.split(':')
 if line[0].strip() != 'lo':
  device_data[line[0].strip()] = data(float(line[1].split()[0])/(1024.0*1024.0),
      float(line[1].split()[8])/(1024.0*1024.0))

 return device_data

def process_list():

 pids = []
 for subdir in os.listdir('/proc'):
 if subdir.isdigit():
  pids.append(subdir)

 return pids

dev_pattern = ['sd.*','xv*']

def size(device):
 nr_sectors = open(device+'/size').read().rstrip('\n')
 sect_size = open(device+'/queue/hw_sector_size').read().rstrip('\n')

 return (float(nr_sectors)*float(sect_size))/(1024.0*1024.0*1024.0)

def detect_devs():
 for device in glob.glob('/sys/block/*'):
 for pattern in dev_pattern:
  if re.compile(pattern).match(os.path.basename(device)):
  print('Device:: {0}, Size:: {1} GiB'.format(device, size(device)))

if __name__=='__main__':
 cpuinfo = cpuinfo()
 for processor in cpuinfo.keys():
 print(cpuinfo[processor]['model name'])

 meminfo = meminfo()
 print('Total memory: {0}'.format(meminfo['MemTotal']))
 print('Free memory: {0}'.format(meminfo['MemFree']))

 netdevs = netdevs()
 for dev in netdevs.keys():
 print('{0}: {1} MiB {2} MiB'.format(dev, netdevs[dev].rx, netdevs[dev].tx))

 pids = process_list()
 print('Total number of running processes:: {0}'.format(len(pids)))

 detect_devs()

以下是脚本的解释部分:

1、OrderedDict,这个功能是可以生成有序字典,大家都知道在python中字典是无序的,当然你也可以根据kye来排序,但用OrderedDict就可以直接生成有序字典,有序字典的顺序只跟你添加的顺序有关。

2、namedtuple,功能是可以给元组的索引起个名字,一般我们访问元组,只能用索引去访问,但如果给索引定义了名字,你就可以用定义的这个名字去访问了,为方便大家理解,我们举个栗子:

>>> from collections import namedtuple
>>> data = namedtuple('data',['rx','tx'])
>>> d = data(123,456)
>>> print d
data(rx=123, tx=456)
>>> print d.rx
123

3、glob,在这行for device in glob.glob(‘/sys/block/*')用到了这个功能,它主要方法就是glob,它返回所有匹配的文件列表。

4、re.compile(pattern).match(os.path.basename(device)),这句是将正则表达式编译为Pattern对象,然后使用Pattern匹配文本,获得匹配结果,匹配成功返回真,无法匹配时将返回None。

总结

以上就是利用python获取操作系统信息的全部内容,利用python来获取还是很方便实用,希望这篇文章对大家的学习和工作能有一定的帮助。

(0)

相关推荐

  • python urllib中的编码处理示例

    复制代码 代码如下: >>> import urllib >>> data = '丽江' >>> print data 丽江 >>> data '\xe4\xb8\xbd\xe6\xb1\x9f' >>> urllib.quote(data) '%E4%B8%BD%E6%B1%9F' 那我们想转回去呢? 复制代码 代码如下: >>> urllib.unquote('%E4%B8%BD%E6%B1%9

  • 简单谈谈Python中函数的可变参数

    前言 在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数. 可变参数( * ) 可变参数,顾名思义,它的参数是可变的,比如列表.字典等.如果我们需要函数处理可变数量参数的时候,就可以使用可变参数. 我们在查看很多Python源码时,经常会看到 某函数(*参数1, **参数2)这样的函数定义,这个*参数和**参数就是可变参数,一时会让人有点费解.其实只要把函

  • Python实现自动添加脚本头信息的示例代码

    前言 每个人写脚本时的格式都会有所不同,有的会注明脚本本身的一些信息,有的则开门见山,这在小团队里其实没什么,基本别人做什么你也都知道,但如果放到大的团队就比较麻烦了,因为随着人数的增多,脚本成指数增长,如果每个人风格不统一,到最后就会造成非常大的弊端,所以当团队人数增长后,就必须有一套标准,形成大家统一的编码规则,这样即使不看脚本具体实现,也知道这个脚本的功能是什么. 我们今天分享的一段脚本是自动添加注释信息的脚本,添加的信息包括脚本名称.作者.时间.描述.脚本用法.语言版本.备注等,下面来看

  • 好用的Python编辑器WingIDE的使用经验总结

    WingIDE的使用 好的工具可以让你做事时,事半功倍!这一点在写代码的过程中尤为明显,使用Pyhton写程序有一年多了!各类编辑器IDE也使用了不少,如Pycharm,sublime,Qtcreator等等,最近开始使用WingIDE,发现使用起来非常顺手,而且支持目前所有主流操作系统!这篇博文用来记录总结,在安装和使用WingIDE过程中的一些有用的经验,技巧! 官网下载链接:http://wingware.com/downloads WingIDE的安装 在windows平台下的安装 1:

  • Python爬虫爬取美剧网站的实现代码

    一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间.之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前一样同步更新了.但是,作为一个宅diao的我又怎甘心没剧追呢,所以网上随便查了一下就找到一个能用迅雷下载的美剧下载网站[天天美剧],各种资源随便下载,最近迷上的BBC的高清纪录片,大自然美得不要不要的. 虽说找到了资源网站可以下载了,但是每次都要打开浏览器,输入网址,找到该美剧,然后点击链接才能下载.时间长了就觉得过程好繁琐,而且有时候网

  • 用Python实现命令行闹钟脚本实例

    前言: 这篇文章给大家介绍了怎样用python创建一个简单的报警,它可以运行在命令行终端,它需要分钟做为命令行参数,在这个分钟后会打印"wake-up"消息,并响铃报警,你可以用0分钟来测试,它会立即执行,用扬声器控制面板调整声音. 以下是脚本: # alarm_clock.py # Description: A simple Python program to make the computer act # like an alarm clock. Start it running

  • python3编码问题汇总

    这两天写了个监测网页的爬虫,作用是跟踪一个网页的变化,但运行了一晚出现了一个问题....希望大家不吝赐教! 我用的是python3,错误在对html response的decode时抛出,代码原样为: response = urllib.urlopen(dsturl) content = response.read().decode('utf-8') 抛出错误为 File "./unxingCrawler_p3.py", line 50, in getNewPhones content

  • Linux下为不同版本python安装第三方库

    问题背景 目前的linux发行版上,有很多安装了两个版本的python. 我的机器上默认的版本为python 2.x.且在使用easy_install安装第三方库时,也默认安装到了2.x的版本上,在3.x版本下则无法import安装的库. 环境:Kubuntu 15.04 解决方法 安装python3-setuptools和easy_install3,并安装pip3 sudo apt-get install python3-setuptools sudo easy_install3 pip su

  • Python 编码处理-str与Unicode的区别

    一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,http参数等等 一运行,发现乱码(字符串处理,读写文件,print) 然后,大多数人的做法是,调用encode/decode进行调试,并没有明确思考为何出现乱码 所以调试时最常出现的错误 错误1 Traceback (most recent call last): File "<stdin>"

  • Python选课系统开发程序

    本文程序针对Python选课系统进行开发,供大家参考,具体内容如下 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格,通过学校创建课程 4. 通过学校创建班级, 班级关联课程.讲师 5. 创建学员时,选择学校,关联班级 5. 创建讲师角色时要关联学校, 6. 提供两个角色接口 7. 学员视图, 可以注册, 交学费, 选择班级, 8. 讲师

  • Python中解析JSON并同时进行自定义编码处理实例

    在对文件内容或字符串进行JSON反序列化(deserialize)时,由于原始内容编码问题,可能需要对反序列化后的内容进行编码处理(如将unicode对象转换为str). 在Python中,一种方式是先使用json.load或json.loads反序列化得到dict对象,然后对这个dict对象进行编码处理. 但其实在json.load与json.loads中,有可选参数object_hook.通过使用此参数,可以对反序列化得到的dict直接进行处理,并使用处理后新的dict替代原dict返回.

  • Python如何获取系统iops示例代码

    iops简介 iops主要用在数据方面,这个指标是数据库性能评定的一个重要参考,iops的是每秒进行读写(I/O)操作的次数,主要看随机访问的性能,一般为了iops增高都要依靠磁盘阵列,实际线上的数据库基本都是raid10的配置,raid5在实际生产环境中如果压力上来是抗不住的,当然也要开具体业务压力情况,如果是用物理机就要看iops在实际中能跑到多少值,现在云也普遍了,如果你用的RDS云数据库,这个iops是可以根据业务情况自己选择的,基本是个参数,可以按需进行修改,当然数值越大费用越高 py

随机推荐