从python脚本运行vnstat

时间:2014-06-02 23:30:05

标签: python command-line interface bandwidth kvm

运行时

vnstat -i [interface] --oneline

打印所选接口的带宽使用情况。

1;eth0;10/11/11;1.45 MiB;801 KiB;2.23 MiB;0.59 kbit/s;Oct '11;3.93 MiB;2.06 MiB;6.00 MiB;0.05 kbit/s;3.93 MiB;2.06 MiB;6.00 MiB

但要从所有接口打印所有带宽使用,我需要运行以下命令来获取所有接口的名称

vnstat --iflist

然后遍历结果以将使用结果存储在列表中

for item in result.split():
    # usage = run command 'vnstat --oneline -i [interface]
    # usageList.append(usage)
print ''.join(usageList)

上面的脚本有效但如果有很多接口则运行缓慢。如何优化?

1 个答案:

答案 0 :(得分:0)

  1. 请注意,/proc/net/*中提供了大量令人敬畏的网络统计信息 - 非常快

  2. 如果你真的想要vnstat(看起来很整洁!),这里有一些代码可以并行扫描每个网络接口。

    导入多处理,子流程,时间

    def check_net(iface):     回来(         我面对,         subprocess.check_output(             [' vnstat'' - ONELINE'' -i',IFACE]         )     )

    ifaces = subprocess.check_output(     [' vnstat',' - iflist']     ).split()[2:]

    尝试:     而真:         pool = multiprocessing.Pool(len(ifaces))         对于iface,在pool.imap_unordered(check_net,ifaces)中输出:             打印iface.upper(),             如果'错误'在输出中:                 打印'?'             其他:                 print output.rstrip()         打印         time.sleep(10) 除KeyboardInterrupt外:     通

  3. 输出:

    LXCBR0 1;lxcbr0;06/02/14;0 KiB;3 KiB;3 KiB;0.00 kbit/s;Jun '14;0 KiB;3 KiB;3 KiB;0.00 kbit/s;0 KiB;3 KiB;3 KiB
    WLAN0 1;wlan0;06/02/14;7.77 MiB;401 KiB;8.17 MiB;1.11 kbit/s;Jun '14;7.77 MiB;401 KiB;8.17 MiB;0.46 kbit/s;7.77 MiB;401 KiB;8.17 MiB
    ETH0  eth0: Not enough data available yet.
    LO ?
    
    ETH0  eth0: Not enough data available yet.
    LXCBR0 1;lxcbr0;06/02/14;0 KiB;3 KiB;3 KiB;0.00 kbit/s;Jun '14;0 KiB;3 KiB;3 KiB;0.00 kbit/s;0 KiB;3 KiB;3 KiB
    WLAN0 1;wlan0;06/02/14;7.77 MiB;401 KiB;8.17 MiB;1.11 kbit/s;Jun '14;7.77 MiB;401 KiB;8.17 MiB;0.46 kbit/s;7.77 MiB;401 KiB;8.17 MiB
    LO ?