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()
assuming you have a proc filesystem it is easier to open /proc/net/dev
ReplyDeleteno 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!
ReplyDeleteBut the first implementation is much more generic. It can be used with any command.
ReplyDeleteHi,
ReplyDeletei think we can get data from :
"/sys/class/net/eth0/statistics/rx_bytes"
and
"/sys/class/net/eth0/statistics/tx_bytes"