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


Posted in Python onSeptember 02, 2016

前言

每一位运维人员都应该对自己所管理的机器配置很清楚,因为这对我们快速处理问题很有帮助,比如随着业务增长,突然某些机器负载上涨的厉害,这时候要排查原因,除了从应用程序、架构上分析外,当前硬件性能的分析应该是必不可少的一环,今天我们将不用第三方模块,用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来获取还是很方便实用,希望这篇文章对大家的学习和工作能有一定的帮助。

Python 相关文章推荐
python读取csv文件示例(python操作csv)
Mar 11 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
Python函数生成器原理及使用详解
Mar 12 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
Python 如何解决稀疏矩阵运算
May 26 Python
Django分页器的用法你都了解吗
May 26 Python
利用Python实现模拟登录知乎
May 25 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 #Python
Linux下为不同版本python安装第三方库
Aug 31 #Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 #Python
分享Python开发中要注意的十个小贴士
Aug 30 #Python
Python将图片批量从png格式转换至WebP格式
Aug 22 #Python
利用Python批量生成任意尺寸的图片
Aug 29 #Python
Python自定义类的数组排序实现代码
Aug 28 #Python
You might like
mysql时区问题
2008/03/26 PHP
PHP实现Socket服务器的代码
2008/04/03 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
详解jquery和vue对比
2019/04/16 jQuery
JsonServer安装及启动过程图解
2020/02/28 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
python保存网页图片到本地的方法
2018/07/24 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
成人教育自我鉴定
2013/11/01 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
阅兵口号
2014/06/19 职场文书
母亲去世追悼词
2015/06/23 职场文书
同学会感言
2015/07/30 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
javascript之Object.assign()的痛点分析
2022/03/03 Javascript
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python