Acho que o ifstat irá ajudá-lo:
[root@localhost ~]# ifstat -i eth0 -q 1 1 eth0 KB/s in KB/s out 3390.26 69.69
Eu quero mostrar a atual utilização da rede (uso da largura de banda) de uma interface de uma caixa Debian em um site. Não é suposto ser muito elaborado ou preciso, apenas um número simples como "52 Mbit / s".
Monitores típicos de largura de banda de rede, como iftop
, não me dão como simplesmente extrair esse valor.
Como posso recuperá-lo melhor?
Por exemplo, acho que posso analisar /proc/net/dev
a cada poucos minutos. Não tenho certeza se essa é realmente a melhor maneira de fazer isso.
A melhor maneira de fazer isso é simplesmente analisar /proc/net/dev
(seja avisado que /proc
não é portátil). Aqui está um script bash
que eu juntei rapidamente e que deve ser capaz de calcular:
#!/bin/bash
_die() {
printf '%s\n' "$@"
exit 1
}
_interface=$1
[[ ${_interface} ]] || _die 'Usage: ifspeed [interface]'
grep -q "^ *${_interface}:" /proc/net/dev || _die "Interface ${_interface} not found in /proc/net/dev"
_interface_bytes_in_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
_interface_bytes_out_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)
while sleep 1; do
_interface_bytes_in_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
_interface_bytes_out_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)
printf '%s: %s\n' 'Bytes in/sec' "$(( _interface_bytes_in_new - _interface_bytes_in_old ))" \
'Bytes out/sec' "$(( _interface_bytes_out_new - _interface_bytes_out_old ))"
# printf '%s: %s\n' 'Kilobytes in/sec' "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 1024 ))" \
# 'Kilobytes out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 1024 ))"
# printf '%s: %s\n' 'Megabits in/sec' "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 131072 ))" \
# 'Megabits out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 131072 ))"
_interface_bytes_in_old=${_interface_bytes_in_new}
_interface_bytes_out_old=${_interface_bytes_out_new}
done
Tenha em mente que sleep
não considera o tempo necessário para executar as operações no loop while, portanto, isso é (muito ligeiramente) impreciso. No meu coppermine de 600mhz, o loop leva 0,011 segundos - uma imprecisão desprezível para a maioria dos propósitos. Tenha em mente também ao usar as saídas de kilobyte / megabit (comentadas), o bash apenas entende a aritmética de inteiros.
Aqui está um script de shell muito simples para calcular isso:
#!/bin/sh
dev=$1
grep -q "^$dev:" /proc/net/dev || exec echo "$dev: no such device"
read rx <"/sys/class/net/$dev/statistics/rx_bytes"
read tx <"/sys/class/net/$dev/statistics/tx_bytes"
while sleep 1; do
read newrx <"/sys/class/net/$dev/statistics/rx_bytes"
read newtx <"/sys/class/net/$dev/statistics/tx_bytes"
# convert bytes to kbit/s: bytes * 8 / 1000 => bytes / 125
echo "$dev {rx: $(((newrx-rx) / 125)), tx: $(((newtx-tx) / 125))}"
rx=$newrx
tx=$newtx
done
inicie o script passando o nome da interface, por exemplo. ./shtraf eth1
Tags networking linux