I needed to get some Linux networking stats in my Python program today. Specifically, I needed 'bytes sent' and 'bytes received' counts since last reboot from the local machine.
ifconfig is a network configuration utility for Linux that you run from the command line:
corey@studio17:~$ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:22:19:e5:07:31 inet addr:10.0.0.5 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::222:19ff:fee5:731/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3353822 errors:0 dropped:0 overruns:0 frame:0 TX packets:3052408 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3476310326 (3.4 GB) TX bytes:256706611 (256.7 MB) Interrupt:17
The following function parses output from ifconfig to get the network stats I was after:
import re import subprocess def get_network_bytes(interface): output = subprocess.Popen(['ifconfig', interface], stdout=subprocess.PIPE).communicate()[0] rx_bytes = re.findall('RX bytes:([0-9]*) ', output)[0] tx_bytes = re.findall('TX bytes:([0-9]*) ', output)[0] return (rx_bytes, tx_bytes)
Example usage:
import re import subprocess def main(): rx_bytes, tx_bytes = get_network_bytes('eth0') print '%s bytes received' % rx_bytes print '%s bytes sent' % tx_bytes def get_network_bytes(interface): output = subprocess.Popen(['ifconfig', interface], stdout=subprocess.PIPE).communicate()[0] rx_bytes = re.findall('RX bytes:([0-9]*) ', output)[0] tx_bytes = re.findall('TX bytes:([0-9]*) ', output)[0] return (rx_bytes, tx_bytes) if __name__ == '__main__': main()
Update: someone left an anonymous comment and mentioned you can just read from proc/net/dev rather than using ifconfig. I modified his code sample and came up with this:
def get_network_bytes(interface): for line in open('/proc/net/dev', 'r'): if interface in line: data = line.split('%s:' % interface)[1].split() rx_bytes, tx_bytes = (data[0], data[8]) return (rx_bytes, tx_bytes)
Example Usage:
def main(): rx_bytes, tx_bytes = get_network_bytes('eth0') print '%s bytes received' % rx_bytes print '%s bytes sent' % tx_bytes def get_network_bytes(interface): for line in open('/proc/net/dev', 'r'): if interface in line: data = line.split('%s:' % interface)[1].split() rx_bytes, tx_bytes = (data[0], data[8]) return (rx_bytes, tx_bytes) if __name__ == '__main__': main()
4 comments:
assuming you have a proc filesystem it is easier to open /proc/net/dev
no subprocess, no regular expression, nothing
def netstats(device):
device = device + ':'
for line in open("/proc/net/dev", "r"):
data = filter(None,line.split(' '))
if data[0] == device :
return (data[1], data[9])
print netstats("eth0")
Agreed. Avoid screen scraping when at all possible!
But the first implementation is much more generic. It can be used with any command.
Hi,
i think we can get data from :
"/sys/class/net/eth0/statistics/rx_bytes"
and
"/sys/class/net/eth0/statistics/tx_bytes"
Post a Comment