나는 웹사이트에서 데비안 박스 인터페이스의 현재 네트워크 사용량(대역폭 사용량)을 표시하고 싶습니다. 매우 복잡하거나 정확해서는 안 되며 "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