วิธีที่ดีที่สุดที่จะทำก็คือการแยก/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
ไม่คำนึงถึงระยะเวลาที่ใช้ในการดำเนินการในขณะที่ลูปดังนั้นจึงไม่ถูกต้อง (เล็กน้อยมาก) สำหรับค็อปเปอร์มิน 600mhz ของฉันการวนรอบใช้เวลา 0.011 วินาที - ความไม่ถูกต้องเล็กน้อยสำหรับวัตถุประสงค์ส่วนใหญ่ โปรดจำไว้ว่าเมื่อใช้เอาต์พุต (ใส่ความคิดเห็น) กิโลไบต์ / เมกะบิตการทุบตีจะเข้าใจเลขคณิตจำนวนเต็มเท่านั้น
/proc/net/dev
โดยไม่เข้าใจสิ่งที่และวิธีการที่เวทมนตร์นี้เกิดขึ้นจริง