从Python脚本中运行vnstat

0 投票
1 回答
1149 浏览
提问于 2025-04-18 08:21

当你运行

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
  1. 注意,在 /proc/net/* 这个地方有很多很棒的网络统计信息,获取这些信息非常快。

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

    首先,我们需要导入一些库:

    import multiprocessing, subprocess, time

    然后定义一个检查网络的函数:

    def check_net(iface):

    return (

    iface,

    subprocess.check_output(

    ['vnstat','--oneline','-i',iface]

    ),

    )

    接下来,我们获取所有的网络接口:

    ifaces = subprocess.check_output(

    ['vnstat', '--iflist']

    ).split()[2:]

    然后我们可以开始一个循环,不断检查网络状态:

    try:

    while True:

    pool = multiprocessing.Pool(len(ifaces))

    for iface,output in pool.imap_unordered(check_net, ifaces):

    print iface.upper(),

    if 'Error' in output:

    print '?'

    else:

    print output.rstrip()

    print

    time.sleep(10)

    except KeyboardInterrupt:

    pass

输出:

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 ?

撰写回答