回答:
それを行うための最良の方法は、おそらく解析することです/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は整数演算のみを理解することに注意してください。
date +%s.%N
すべての反復のためのUNIXタイムスタンプを取得し、タイムスタンプの差によってバイト差を分割します。次に、ループの反復が1秒より長くなる問題を回避します。
トラフィックの 毎月の記録を保持するvnstatなどのネットワークトラフィックモニターや、カーネルに保存されている値から直接値を取得するslurmがあります。ほとんどのディストリビューションリポジトリで利用できます。
これが私が走ったときに私が見るものですslurm -i ra0
:
これを計算するための非常に単純なシェルスクリプトを次に示します。
#!/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
/proc/net/dev
この魔法が何がどのように発生するかを実際に理解せずに、舞台裏で解析を中継します。