답변:
그것을하는 가장 좋은 방법은 아마도 구문 분석하는 것입니다 /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 coppermine에서 루프는 0.011 초가 걸립니다. 대부분의 경우 무시할 수없는 부정확성입니다. (commented out) 킬로바이트 / 메가 비트 출력을 사용할 때도 bash는 정수 산술 만 이해합니다.
date +%s.%N
모든 반복에 대한 유닉스 타임 스탬프를 얻을 타임 스탬프 차이에 의해 바이트 차이를 분할합니다. 그런 다음 루프 반복이 1보다 길다는 문제를 피하십시오.
이것을 계산하는 매우 간단한 쉘 스크립트는 다음과 같습니다.
#!/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
이 마술이 어떻게 그리고 어떻게 발생하는지 실제로 이해하지 않고 무대 뒤에서 파싱을 중계 합니다.