利用Python獲取操作系統信息實例
前言
每一位運維人員都應該對自己所管理的機器配置很清楚,因為這對我們快速處理問題很有幫助,比如隨著業(yè)務增長,突然某些機器負載上漲的厲害,這時候要排查原因,除了從應用程序、架構上分析外,當前硬件性能的分析應該是必不可少的一環(huán),今天我們將不用第三方模塊,用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環(huán)境詳解
這篇文章主要為大家詳細介紹了python自動化腳本安裝指定版本python環(huán)境的相關方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09

