利用Python获取操作系统信息实例
前言
每一位运维人员都应该对自己所管理的机器配置很清楚,因为这对我们快速处理问题很有帮助,比如随着业务增长,突然某些机器负载上涨的厉害,这时候要排查原因,除了从应用程序、架构上分析外,当前硬件性能的分析应该是必不可少的一环,今天我们将不用第三方模块,用python自带模块和系统提供的运行信息来获取我们需要的信息,这个脚本除了硬件外,还抓取了当前系统进程数和网卡流量功能,所以这个版本实现的功能基本对应了之前psutil实现的内容,多的不说了,直接贴代码:
#!/usr/bin/envpython fromcollectionsimportOrderedDict fromcollectionsimportnamedtuple importos importglob importre defcpuinfo(): cpuinfo=OrderedDict() procinfo=OrderedDict() nprocs=0 withopen('/proc/cpuinfo')asf: forlineinf: ifnotline.strip(): cpuinfo['proc%s'%nprocs]=procinfo nprocs=nprocs+1 procinfo=OrderedDict() else: iflen(line.split(':'))==2: procinfo[line.split(':')[0].strip()]=line.split(':')[1].strip() else: procinfo[line.split(':')[0].strip()]='' returncpuinfo defmeminfo(): meminfo=OrderedDict() withopen('/proc/meminfo')asf: forlineinf: meminfo[line.split(':')[0]]=line.split(':')[1].strip() returnmeminfo defnetdevs(): withopen('/proc/net/dev')asf: net_dump=f.readlines() device_data={} data=namedtuple('data',['rx','tx']) forlineinnet_dump[2:]: line=line.split(':') ifline[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)) returndevice_data defprocess_list(): pids=[] forsubdirinos.listdir('/proc'): ifsubdir.isdigit(): pids.append(subdir) returnpids dev_pattern=['sd.*','xv*'] defsize(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) defdetect_devs(): fordeviceinglob.glob('/sys/block/*'): forpatternindev_pattern: ifre.compile(pattern).match(os.path.basename(device)): print('Device::{0},Size::{1}GiB'.format(device,size(device))) if__name__=='__main__': cpuinfo=cpuinfo() forprocessorincpuinfo.keys(): print(cpuinfo[processor]['modelname']) meminfo=meminfo() print('Totalmemory:{0}'.format(meminfo['MemTotal'])) print('Freememory:{0}'.format(meminfo['MemFree'])) netdevs=netdevs() fordevinnetdevs.keys(): print('{0}:{1}MiB{2}MiB'.format(dev,netdevs[dev].rx,netdevs[dev].tx)) pids=process_list() print('Totalnumberofrunningprocesses::{0}'.format(len(pids))) detect_devs()
以下是脚本的解释部分:
1、OrderedDict,这个功能是可以生成有序字典,大家都知道在python中字典是无序的,当然你也可以根据kye来排序,但用OrderedDict就可以直接生成有序字典,有序字典的顺序只跟你添加的顺序有关。
2、namedtuple,功能是可以给元组的索引起个名字,一般我们访问元组,只能用索引去访问,但如果给索引定义了名字,你就可以用定义的这个名字去访问了,为方便大家理解,我们举个栗子:
>>>fromcollectionsimportnamedtuple >>>data=namedtuple('data',['rx','tx']) >>>d=data(123,456) >>>printd data(rx=123,tx=456) >>>printd.rx 123
3、glob,在这行fordeviceinglob.glob(‘/sys/block/*')用到了这个功能,它主要方法就是glob,它返回所有匹配的文件列表。
4、re.compile(pattern).match(os.path.basename(device)),这句是将正则表达式编译为Pattern对象,然后使用Pattern匹配文本,获得匹配结果,匹配成功返回真,无法匹配时将返回None。
总结
以上就是利用python获取操作系统信息的全部内容,利用python来获取还是很方便实用,希望这篇文章对大家的学习和工作能有一定的帮助。