Constantemente nos perguntamos qual é a velocidade real que estamos navegando. Seja por linha discada, ADSL, 3G, Ethernet… não importa isso é essencial até mesmo para satisfazer o ego dos abençoados com links de 8mbps ou mais. O que mostro aqui é simplesmente um shell-script que calcula a velocidade lendo os dados do diretório virtual /sys existente em qualquer distribuição Linux com kernel 2.6.
Indo direto ao script
R1=`cat /sys/class/net/ppp0/statistics/rx_bytes` ; R2=$R1;
while [ 1=1 ]; do
R2=`cat /sys/class/net/ppp0/statistics/rx_bytes`; SPEED=$(( ($R2 - $R1)/10 ));
R1=$R2; echo $SPEED "bytes/s"; sleep 10s; done
Só isso! Desculpe se você esperava mais do que isso, mas isso é suficiente para ler ler o total de bytes recebidos[1] por sua conexão ppp0[2] a cada 10s[3], se quiser em bits/s apenas acrescente um “*8” na fórmula, já que para converter de bytes para bits basta multiplicar os bytes por 8.
[1] Veja que o arquivo lido é o rx_bytes, se quiser medir a velocidade de upload substitua pelo arquivo tx_bytes, nas duas ocorrências;
[2] Note que para mudar a interface de rede bata mudar o diretório ppp0 pelo correspondente a sua interface ligada ao modem ADSL, eth0, por exemplo;
[3] A medição é feita pela média de 10 segundos de leitura, mas se quiser uma medida em tempo real – a cada segundo – mude o valor (em segundos) tanto na fórmula da variável SPEED e no comando sleep.
Concluindo
É claro que isso poderia ser mais bonito, usando um monte de variáveis de configuração bonitas ou mesmo ler estes parâmetros pela linha de comando. Mas meu objetivo era só mostrar o quanto é simples fazer tal leitura.
Agora use a criatividade e desenvolva o seu poderoso utilitário para monitorar a rede, na linguagem de sua escolha, ou simplesmente use-o como está.
Se quiser também leia o post sobre os arquivos úteis em /proc e /sys para ver o que mais se pode fazer com o conteúdo destes sistemas de arquivo virtuais e divirta-se!
Atualização: Veja o comentário nº 1 para ver uma versão mais elaborada.
Só para constar. Esta versão está um pouco mais elaborada (talvez menos didática), mas por outro lado é mais funcional, já que possui variáveis de configuração para facilitar a mudança de interface, do intervalo de atualização e a escolha do tráfego de download (rx) ou upload (tx)
IFACE=ppp0;
INTERVALO=10;
TRAFEGO=rx;
R1=`cat /sys/class/net/${IFACE}/statistics/${TRAFEGO}_bytes` ;
R2=${R1};
while [ 1=1 ]; do
R2=`cat /sys/class/net/${IFACE}/statistics/${TRAFEGO}_bytes`;
SPEED=$(( (${R2} – ${R1})/${INTERVALO} ));
R1=${R2}; echo ${SPEED} “bytes/s”; sleep ${INTERVALO}s; done
Cara, é possível medir a velocidade de Upload também?
@Hian
É possível sim. Veja a obsrevação [1] que está no texto.
Interessante a publicação.
Apenas acho desnecessário o “R2=$R1;” na primeira linha. O R2 recebe dentro do laço os valores de rx_bytes, perdendo os dados antigos.
Interessante a publicação.
Apenas acho desnecessário o “R2=$R1;” na primeira linha. O R2 recebe dentro do laço os valores de rx_bytes, perdendo os dados antigos.
Outra coisa, textando simplesmente os valore de rx_bytes (cat /sys/class/net/ppp0/statistics/rx_bytes) entendo que ele dá o número de bytes a cada momento. Se quisermos a média de 10 segundos teríamos que ler a cada 10 segundos somar esses valores e dividir por 10.
Experimentem mudar o script acima para 5 ou 2 segundos. Verão que a média aumenta.
Penso que seria assim:
#!/bin/bash
SPEED=`cat /sys/class/net/eth0/statistics/rx_bytes`;
echo “Iniciando..”;
while [ 1=1 ]; do
SRX=0;
for k in {1..10}; do
RX=`cat /sys/class/net/eth0/statistics/rx_bytes`;
SRX=$(($SRX+$RX));
sleep 1s;
done
SPEED=$((($SRX)/10))
echo $SPEED “bytes/s”;
done
Não consegui apagar o primeiro comentário.
Aliás, minha variável SPEED na segunda linha também é desnecessária.
nem funciona, mudei o device para wlp4s6 que uso atualmente, msm assim não passa 0 bytes;