Created
August 4, 2012 18:59
-
-
Save breunigs/3259332 to your computer and use it in GitHub Desktop.
bash script that measures the network throughput on configured adapters between calls. Intended to be used with i3status/i3bar and similar. Strives to only use bash-builtins.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Public Domain | |
# (someone claimed the next lines would be useful for… people. So here goes: | |
# © 2012 Stefan Breunig | |
# [email protected]) | |
# append i3status output to the measure-net-speed’s one. the quote and escape | |
# magic is required to get valid JSON output, which is expected by i3bar (if | |
# you want colors, that is. Otherwise plain text would be fine). For colors, | |
# your i3status.conf should contain: | |
# general { | |
# output_format = i3bar | |
# } | |
# i3 config looks like this: | |
# bar { | |
# status_command measure-net-speed-i3status.bash | |
# } | |
i3status | (read line && echo $line && while : | |
do | |
read line | |
dat=$(measure-net-speed.bash) | |
dat="[{ \"full_text\": \"${dat}\" }," | |
echo "${line/[/$dat}" || exit 1 | |
done) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Public Domain | |
# (someone claimed the next lines would be useful for… people. So here goes: | |
# © 2012 Stefan Breunig | |
# [email protected]) | |
# path to store the old results in | |
path="/dev/shm/measure-net-speed" | |
# grabbing data for each adapter. | |
# You can find the paths to your adapters using | |
# find /sys/devices -name statistics | |
# If you have more (or less) than two adapters, simply adjust the script here | |
# and in the next block. | |
eth0="/sys/devices/pci0000:00/0000:00:19.0/net/eth0/statistics" | |
wlan0="/sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics" | |
read eth0_rx < "${eth0}/rx_bytes" | |
read eth0_tx < "${eth0}/tx_bytes" | |
read wlan0_rx < "${wlan0}/rx_bytes" | |
read wlan0_tx < "${wlan0}/tx_bytes" | |
# get time and sum of rx/tx for combined display | |
time=$(date +%s) | |
rx=$(( $eth0_rx + $wlan0_rx )) | |
tx=$(( $eth0_tx + $wlan0_tx )) | |
# write current data if file does not exist. Do not exit, this will cause | |
# problems if this file is sourced instead of executed as another process. | |
if ! [[ -f "${path}" ]]; then | |
echo "${time} ${rx} ${tx}" > "${path}" | |
chmod 0666 "${path}" | |
fi | |
# read previous state and update data storage | |
read old < "${path}" | |
echo "${time} ${rx} ${tx}" > "${path}" | |
# parse old data and calc time passed | |
old=(${old//;/ }) | |
time_diff=$(( $time - ${old[0]} )) | |
# sanity check: has a positive amount of time passed | |
if [[ "${time_diff}" -gt 0 ]]; then | |
# calc bytes transferred, and their rate in byte/s | |
rx_diff=$(( $rx - ${old[1]} )) | |
tx_diff=$(( $tx - ${old[2]} )) | |
rx_rate=$(( $rx_diff / $time_diff )) | |
tx_rate=$(( $tx_diff / $time_diff )) | |
# shift by 10 bytes to get KiB/s. If the value is larger than | |
# 1024^2 = 1048576, then display MiB/s instead (simply cut off | |
# the last two digits of KiB/s). Since the values only give an | |
# rough estimate anyway, this improper rounding is negligible. | |
# incoming | |
rx_kib=$(( $rx_rate >> 10 )) | |
if [[ "$rx_rate" -gt 1048576 ]]; then | |
echo -n "${rx_kib:0:-3}.${rx_kib: -3:-2} M↓" | |
else | |
echo -n "${rx_kib} K↓" | |
fi | |
echo -n " " | |
# outgoing | |
tx_kib=$(( $tx_rate >> 10 )) | |
if [[ "$tx_rate" -gt 1048576 ]]; then | |
echo -n "${tx_kib:0:-3}.${tx_kib: -3:-2} M↑" | |
else | |
echo -n "${tx_kib} K↑" | |
fi | |
else | |
echo -n " ? " | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment