Làm thế nào tôi nên xác định việc sử dụng mạng hiện tại?


9

Tôi muốn hiển thị mức sử dụng mạng hiện tại (sử dụng băng thông) của một giao diện của hộp Debian trên trang web. Nó không phải là rất phức tạp hoặc chính xác, chỉ là một số đơn giản như "52 Mbit / s".

Các màn hình băng thông mạng điển hình như iftopcho tôi không có cách nào để trích xuất một giá trị như vậy.

Làm thế nào tôi có thể lấy nó tốt nhất?

Ví dụ, tôi đoán tôi có thể phân tích cú pháp /proc/net/devcứ sau vài phút. Không chắc chắn nếu đây thực sự là cách tốt nhất để làm điều này.

Câu trả lời:


10

Tôi nghĩ ifstat sẽ giúp bạn:

[root @ localhost ~] # ifstat -i eth0 -q 1 1
       eth0
 KB / s tính bằng KB / s
 3390,26 69,69

7

Cách tốt nhất để làm điều đó chỉ đơn giản là phân tích cú pháp /proc/net/dev(được cảnh báo rằng /procnó không phải là di động). Đây là một bashkịch bản tôi nhanh chóng kết hợp để có thể tính toán nó:

#!/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

Hãy nhớ rằng sleepkhông xem xét lượng thời gian cần thiết để thực hiện các thao tác trong vòng lặp while, do đó, điều này là (rất nhẹ) không chính xác. Trên đồng 600mhz của tôi, vòng lặp mất 0,011 giây - độ chính xác không đáng kể cho hầu hết các mục đích. Cũng lưu ý khi sử dụng các đầu ra kilobyte / megabit (nhận xét), bash chỉ hiểu số học số nguyên.


Tôi nghĩ rằng đây nên là câu trả lời được lựa chọn. Mọi giải pháp khác đều chuyển tiếp, đằng sau hậu trường, về phân tích cú pháp /proc/net/dev, mà không thực sự hiểu điều gì và làm thế nào phép thuật này xảy ra.
Eran

Giải pháp này làm việc cho tôi trên một bộ định tuyến / busybox.
cloneman

Sử dụng date +%s.%Nđể lấy dấu thời gian unix cho mỗi lần lặp và chia chênh lệch byte cho chênh lệch dấu thời gian. Sau đó, bạn tránh được vấn đề lặp lặp dài hơn 1 giây.
Arnavion

3

Có các trình giám sát lưu lượng mạng như vnstat lưu giữ các bản ghi hàng tháng về lưu lượng truy cập của bạn hoặc slurm lấy giá trị của nó trực tiếp từ các lưu trữ trong kernel. Nó có sẵn trong hầu hết các bản phân phối.

Đây là những gì tôi thấy khi tôi chạy slurm -i ra0:

nhập mô tả hình ảnh ở đây


1

Đây là một kịch bản shell rất đơn giản để tính toán điều này:

#!/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

chỉ cần bắt đầu tập lệnh chuyển tên giao diện, vd. ./shtraf eth1


1
Bạn có thể giải thích điều này một chút? Chính xác thì tham số nên là gì? Ý nghĩa của là 125gì? Xin vui lòng không trả lời trong các ý kiến; chỉnh sửa câu trả lời của bạn để làm cho nó rõ ràng và đầy đủ hơn.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.