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