LINUX网卡实时流量监控

用yield实现生产者消费者,实时处理数据。纯练手

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import os,sys,time
 
#field = ['face', 'rece_bytes', 'rece_packets', 'rece_errs', 'rece_drop', 'rece_fifo', 'rece_frame', 'rece_compressed', 'rece_multicast', 'trans_bytes', 'trans_packets', 'trans_errs', 'trans_drop', 'trans_fifo', 'trans_colls', 'trans_carrier', 'trans_compressed']
field = ['face', 'rec_bt', 'rec_pkt', 'rec_errs', 'rec_drop', 'rec_fifo', 'rec_frame', 'rec_comp', 'rec_mult', 'trans_bt', 'trans_pkt', 'trans_errs', 'trans_drop', 'trans_fifo', 'trans_colls', 'trans_carr', 'trans_comp']
ds = False;
 
def openfile(zip_net_list):
    #打开/proc/net/dev文件,获取网卡数据。2秒读取一次
    while 1:
        info = []
        fi = open('/proc/net/dev','r')
        i=0
        for line in fi:
            if line.find('eth0')!=-1:
                line = line.replace(':','')
                field = line.split()
                if (len(field)<8):
                    continue
                info.append(field)
            i=i+1
        fi.close()
        zip_net_list.append( info[0] )
        yield zip_net_list
        time.sleep(2)
 
def subcri(list,list2):
    #整理网卡数据
    result={}
    _len = len(field)
    for i in range(_len):
        if field[i]=='face':
            result[field[i]] = list[i]
            continue
        elif field[i]=='rec_bt':
            result[field[i]] = str(round((float(list2[i]) - float(list[i]))/1024, 2))+'kb'
        elif field[i]=='trans_bt':
            result[field[i]] = str(round((float(list2[i]) - float(list[i]))/1024, 2))+'kb'
        else:
            result[field[i]] = list2[i];
    del result['rec_fifo']
    del result['rec_mult']
    del result['trans_colls']
    del result['trans_carr']
    return result;
 
def formats(data):
    #格式化输出
    da=[]
    global ds
    keys = sorted(data.keys())
    if ds == False:
        print '-'*140
        print '|'.join([dd.ljust(10) for dd in keys])
        ds=True
    else:
        print '-'*140
        for i in keys:
            da.append(data[i])
        print '|'.join([d.ljust(10) for d in da])
 
def process(zip_net_list):
    #调用yield,进行数据获取
    p = openfile(zip_net_list)
    while 1:
        try:
            p.next()
            while len(zip_net_list)>1:
                prev = zip_net_list.pop(0)
                curr = zip_net_list[0]
                formats(subcri(prev, curr))
        except StopIteration:
            sys.exit(0)
 
if __name__=='__main__':
    zip_net_list=[]
    process(zip_net_list)