亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

利用Python獲取操作系統(tǒng)信息實(shí)例

原創(chuàng) 2017-01-16 14:40:17 276
摘要:前言每一位運(yùn)維人員都應(yīng)該對自己所管理的機(jī)器配置很清楚,因?yàn)檫@對我們快速處理問題很有幫助,比如隨著業(yè)務(wù)增長,突然某些機(jī)器負(fù)載上漲的厲害,這時(shí)候要排查原因,除了從應(yīng)用程序、架構(gòu)上分析外,當(dāng)前硬件性能的分析應(yīng)該是必不可少的一環(huán),今天我們將不用第三方模塊,用python自帶模塊和系統(tǒng)提供的運(yùn)行信息來獲取我們需要的信息,這個(gè)腳本除了硬件外,還抓取了當(dāng)前系統(tǒng)進(jìn)程數(shù)和網(wǎng)卡流量功能,所以這個(gè)版本實(shí)現(xiàn)的功能基本對應(yīng)

前言

每一位運(yùn)維人員都應(yīng)該對自己所管理的機(jī)器配置很清楚,因?yàn)檫@對我們快速處理問題很有幫助,比如隨著業(yè)務(wù)增長,突然某些機(jī)器負(fù)載上漲的厲害,這時(shí)候要排查原因,除了從應(yīng)用程序、架構(gòu)上分析外,當(dāng)前硬件性能的分析應(yīng)該是必不可少的一環(huán),今天我們將不用第三方模塊,用python自帶模塊和系統(tǒng)提供的運(yùn)行信息來獲取我們需要的信息,這個(gè)腳本除了硬件外,還抓取了當(dāng)前系統(tǒng)進(jìn)程數(shù)和網(wǎng)卡流量功能,所以這個(gè)版本實(shí)現(xiàn)的功能基本對應(yīng)了之前psutil實(shí)現(xiàn)的內(nèi)容,多的不說了,直接貼代碼:

#!/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,這個(gè)功能是可以生成有序字典,大家都知道在python中字典是無序的,當(dāng)然你也可以根據(jù)kye來排序,但用OrderedDict就可以直接生成有序字典,有序字典的順序只跟你添加的順序有關(guān)。

2、namedtuple,功能是可以給元組的索引起個(gè)名字,一般我們訪問元組,只能用索引去訪問,但如果給索引定義了名字,你就可以用定義的這個(gè)名字去訪問了,為方便大家理解,我們舉個(gè)栗子:

>>> 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/*')用到了這個(gè)功能,它主要方法就是glob,它返回所有匹配的文件列表。

4、re.compile(pattern).match(os.path.basename(device)),這句是將正則表達(dá)式編譯為Pattern對象,然后使用Pattern匹配文本,獲得匹配結(jié)果,匹配成功返回真,無法匹配時(shí)將返回None。

更多關(guān)于利用Python獲取操作系統(tǒng)信息實(shí)例請關(guān)注PHP中文網(wǎng)(ipnx.cn)其他文章! 

發(fā)佈手記

熱門詞條