
私はWebサイトでDebianボックスインターフェースの現在のネットワーク使用量(帯域幅使用量)を表示したいと思います。非常に複雑で正確ではありません。「52 Mbit / s」などの単純な数字でなければなりません。
一般的なネットワーク帯域幅モニタでは、iftop
これらの値を単純に抽出することはできません。
どうすれば最良の検索ができますか?
/proc/net/dev
たとえば、数分ごとに解析できると思いました。しかし、これが本当に最善の方法であるかどうかはわかりません。
答え1
ifstatが役に立つと思います。
[root@localhost ~]# ifstat -i eth0 -q 1 1 イーサネット0 KB/秒入力 KB/秒出力 3390.26 69.69
答え2
最も簡単な方法はおそらく解析することです/proc/net/dev
(これは/proc
移植可能ではありません)。以下は、bash
これを計算できるように私が書いたクイックスクリプトです。
#!/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
sleep
whileループ内でタスクを実行するのに必要な時間は考慮されていないため、これは(かなり少し)不正確です。私の600mhz銅鉱山では、ループに0.011秒かかります。ほとんどの場合、このエラーは無視できます。また、bashは(注釈付き)キロバイト/メガビット出力を使用するときに整数演算のみを理解することを忘れないでください。
答え3
これはこれを計算する非常に簡単なシェルスクリプトです。
#!/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
たとえば、インターフェイス名を渡すスクリプトを起動します。./shtraf eth1
答え4
評判が足りないのでコメントできないので、別の回答を投稿します。しかし、私の功労を認められる資格はありません。公開されたスクリプトと同じです。タークノラブここで。寛大な側面で動作するようにスペースを追加しました。
したがって、私と同じで、Xiaomi-dafang-hacksで帯域幅使用量を監視する方法を探していますが、ツールをインストールできない場合は、このスクリプトが機能します。唯一の違いは、/proc/net/dev の先頭の空白です。理由はわかりませんが、通常、この線はインターフェースから始まるのではなく、スペースとインターフェースで始まります。これが他の人に役立つことを願っています。
#!/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