- Скрипт берёт байты из /proc/net/dev, ждёт секунду.
- Берёт новые байты из /proc/net/dev
- Вычитает из новых старые.
Я ожидал увидеть скорость в секунду, но скрипт врёт. Там где curl показывает 5.7mb — скрипт аж 6.2mb.
Подозреваю, что (время вычислений) + (1 секунда) по времени забирают больше одной секунды и я получаю скорость за 1.1 секунды, например.
Скрипт можно разнести на две части — (только вычитание) + (обёртка со всем остальным).
В этом случае значения скорости будут писаться в /tmp, а обёртка будет их использовать — таким образом я получу не скорость за 1.1 секунды, а скорость за 1.03 секунду, которая будет обновляться раз в 1.07 секунды.
Как *совсем* избавиться от погрешности, связанной со временем на вычитание?
Скрипт:
#!/bin/bash
SLEEP=1
function wrapper_net {
echo $(printf "%04s" $1 | sed "s/ /0/g")
}
interface=eth0
get_bytes()
{
line=$(cat /proc/net/dev | grep $interface | awk '{print "received_bytes="$2, "transmitted_bytes="$10}')
eval $line
}
get_velocity()
{
vel=$[$1-$2]
if [ $vel -ge 1024 ] && [ $vel -lt 1048576 ] ;
then
velKB=$[vel/1024];
echo "$(wrapper_net $velKB)K";
elif [ $vel -ge 1048576 ];
then
velMB=$(echo "scale=1; $vel/1048576" | bc)
echo "$(wrapper_net $velMB)M";
else
echo "$(wrapper_net $vel) ";
fi
}
# Gets initial values.
get_bytes
old_received_bytes=$received_bytes
old_transmitted_bytes=$transmitted_bytes
# Loop
while :; do
get_bytes
vel_recv=$(get_velocity $received_bytes $old_received_bytes)
vel_trans=$(get_velocity $transmitted_bytes $old_transmitted_bytes)
old_received_bytes=$received_bytes
old_transmitted_bytes=$transmitted_bytes
echo -en "$vel_recv\t $vel_trans\r"
sleep $SLEEP; done