利用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写的一个简单DNS服务器实例
Jun 04 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
python 字符串追加实例
Jul 20 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
Python timer定时器两种常用方法解析
Jan 20 Python
python递归函数用法详解
Oct 26 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
python3中for循环踩过的坑记录
Dec 14 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 Smarty模板生成html文档的方法
2010/04/12 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
PHP查询网站的PR值
2013/10/30 PHP
php 魔术方法详解
2014/11/11 PHP
php使用正则验证中文
2016/04/06 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
vue实现简单图片上传
2020/06/30 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
Python读取网页内容的方法
2015/07/30 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
模具设计与制造专业推荐信
2014/02/16 职场文书
单位委托函范文
2015/01/29 职场文书
2015年团支书工作总结
2015/04/03 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python