Je veux afficher l'utilisation actuelle du réseau (utilisation de la bande passante) d'une interface d'une boîte Debian sur un site web. Il n'est pas supposé être très élaboré ou précis, juste un nombre simple comme "52 Mbit / s".
Les moniteurs de bande passante réseau typiques tels que iftop
ne me permettent pas d'extraire simplement une telle valeur.
Comment puis-je le récupérer?
Par exemple, je suppose que je pourrais parsingr /proc/net/dev
toutes les quelques minutes. Je ne sais pas si c'est vraiment la meilleure façon de le faire.
Je pense que ifstat va vous aider:
[root @ localhost ~] # ifstat -i eth0 -q 1 1 eth0 KB / s en Ko / s 3390,26 69,69
La meilleure façon de le faire est simplement d'parsingr /proc/net/dev
(soyez prévenu que /proc
n'est pas portable). Voici un script bash
j'ai rapidement mis en place et qui devrait pouvoir le calculer:
#!/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
Gardez à l'esprit que le sleep
ne prend pas en count le time nécessaire pour effectuer les opérations dans la boucle while, ce qui est (très légèrement) inexact. Sur ma coppermine 600mhz, la boucle prend 0,011 secondes – une inexactitude négligeable pour la plupart des objectives. Gardez également à l'esprit lorsque vous utilisez les sorties (commentées) en kilo-octets / mégabits, bash ne comprend que l'arithmétique entière.
Il y a des moniteurs de trafic réseau comme vnstat qui garde des loggings mensuels de votre trafic, ou slurm qui prend ses valeurs directement à partir de celles stockées dans le kernel. Il est disponible dans la plupart des repositorys distro.
Voici ce que je vois quand je cours slurm -i ra0
: