利用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实现udp数据报传输的方法
Sep 26 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
python实现超简单端口转发的方法
Mar 13 Python
Python中处理时间的几种方法小结
Apr 09 Python
python中threading超线程用法实例分析
May 16 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
django初始化数据库的实例
May 27 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python 判断一组数据是否符合正态分布
Sep 23 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
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
php cookie 详解使用实例
2016/11/03 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
node.js通过url读取文件
2020/10/16 Javascript
python获得文件创建时间和修改时间的方法
2015/06/30 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
详解Python用户登录接口的方法
2019/04/17 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
python时间日期操作方法实例小结
2020/02/06 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
python如何调用java类
2020/07/05 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
大学本科毕业生的自我鉴定
2013/11/26 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python