लिनक्स में KB / MB / बाइट्स प्रारूप के साथ और विशिष्ट पोर्ट या एप्लिकेशन प्रक्रिया के लिए वास्तविक समय नेटवर्क आँकड़े कैसे प्राप्त करें?


22

मैं प्रयोग किया जाता है IPTraf, Iftop, vnstat, bwm-ng, ifconfig -a। उनमें से कोई भी मुझे वास्तविक समय के पैकेट को खोजने में मदद नहीं कर रहा है जो मेरे आवेदन से KB / MB प्रारूप में भेजे / प्राप्त किए जा रहे हैं। कारण यह है कि मैं एक आवेदन लिख रहा हूं, जहां मुझे यह सुनिश्चित करने की आवश्यकता है कि मेरा संपीड़न सही है, लेकिन मैं आगे बढ़ने के लिए परीक्षण नहीं कर सकता।

क्या मैं बहुत विशिष्ट और सटीक वास्तविक समय नेटवर्क आँकड़ों को ट्रैक करने के लिए उपयोग कर सकता हूं?

यहाँ छवि विवरण दर्ज करें

जवाबों:


27

आपका आवेदन संभवतः विशिष्ट यूडीपी या टीसीपी पोर्ट नंबर या एक विशिष्ट आईपी-पते पर पैकेट भेज रहा है।

इसलिए आप उस ट्रैफ़िक को पकड़ने के लिए TCPdump जैसी किसी चीज़ का उपयोग कर सकते हैं।

TCPdump आपको आपकी इच्छा के अनुसार वास्तविक समय के आँकड़े नहीं देता है, लेकिन आप इसे कुछ ऐसा करने के लिए आउटपुट दे सकते हैं (मैं बाद में एक उत्तर के साथ इस उत्तर को अपडेट करने की कोशिश करूँगा)।


अपडेट करें:

$ sudo tcpdump -i eth1 -l -e -n | ./netbps
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:36:53    2143.33 Bps
11:37:03    1995.99 Bps
11:37:13    2008.35 Bps
11:37:23    1999.97 Bps
11:37:33    2083.32 Bps
131 packets captured
131 packets received by filter
0 packets dropped by kernel

मैंने एक मिनट बाद Ctrl + C दबाकर बाधित किया।

आपको tcpdumpकमांड के अंत में एक उपयुक्त फ़िल्टर एक्सप्रेशन जोड़ना होगा जिसमें केवल आपके ऐप द्वारा उत्पन्न ट्रैफ़िक शामिल हो (जैसे port 123)

कार्यक्रम netbpsयह है:

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;

my $reporting_interval = 10.0; # seconds
my $bytes_this_interval = 0;
my $start_time = [Time::HiRes::gettimeofday()];

STDOUT->autoflush(1);

while (<>) {
  if (/ length (\d+):/) {
    $bytes_this_interval += $1;
    my $elapsed_seconds = Time::HiRes::tv_interval($start_time);
    if ($elapsed_seconds > $reporting_interval) {
       my $bps = $bytes_this_interval / $elapsed_seconds;
       printf "%02d:%02d:%02d %10.2f Bps\n", (localtime())[2,1,0],$bps;
       $start_time = [Time::HiRes::gettimeofday()];
       $bytes_this_interval = 0;
    }
  }
}

यह सिर्फ एक उदाहरण है, स्वाद के लिए समायोजित करें।


बहुत धन्यवाद, मैं आपके काम करने के उदाहरण का इंतजार करूंगा। मेरा लक्ष्य ऐसा था जैसे मैंने $ bwm-ng -o प्लेन -N -d के साथ किया था जो आउटपुट को इंटरफेस के द्वारा थोड़ा दिखाता है लेकिन अगर विफल रहता है तो इंटरफ़ेस का उपयोग लो को छोड़कर किया जाता है। दूसरे हाथ में IPtraf उत्कृष्ट बाइट्स realtime दिखाता है। लेकिन कोई भी उपकरण नहीं है जो मुझे विशिष्ट इंटरफ़ेस या कुल के रूप में किसी भी इंटरफ़ेस के लिए RX / TX में बिट्स और बाइट्स रियलटाइम की तरह बता सकता है आदि मैं इसे याद कर रहा हूं :-(
यम्युम्यम

@YumYum: उत्तर अपडेट किया गया।
RedGrittyBrick

1
@RedGrittyBrick आप पूर्ण किंवदंती! महान स्क्रिप्ट! शेयर करने के लिए बहुत बहुत शुक्रिया। यह मेरे सवाल का जवाब superuser.com/questions/395226/…
Eamorr

यह एक एम्बेडेड रूटर्स पर बिजीबॉक्स बैश में काम करना चाहिए: gist.github.com/dagelf/8a842ed755354b31e79214042a4a4695
Dagelf

यह भी साथ हासिल की हैvnstat -tr
St0rM

14

उसी फ़ोल्डर से नीचे के रूप में उपयोग:

प्रति इंटरफ़ेस पैकर की जांच करने के लिए: ./netpps.sh eth0

प्रति इंटरफ़ेस की गति की जाँच करने के लिए: ./netspeed.sh eth0

फ़ाइल नाम के रूप में इंटरफ़ेस नेटपेकश पर दूसरा प्रति पैकेट मापें

#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        echo shows packets-per-second
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_packets`
        T1=`cat /sys/class/net/$1/statistics/tx_packets`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_packets`
        T2=`cat /sys/class/net/$1/statistics/tx_packets`
        TXPPS=`expr $T2 - $T1`
        RXPPS=`expr $R2 - $R1`
        echo "TX $1: $TXPPS pkts/s RX $1: $RXPPS pkts/s"
done

फ़ाइल नाम के रूप में इंटरफ़ेस netspeed.sh पर नेटवर्क बैंडविड्थ को मापें

#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_bytes`
        T1=`cat /sys/class/net/$1/statistics/tx_bytes`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_bytes`
        T2=`cat /sys/class/net/$1/statistics/tx_bytes`
        TBPS=`expr $T2 - $T1`
        RBPS=`expr $R2 - $R1`
        TKBPS=`expr $TBPS / 1024`
        RKBPS=`expr $RBPS / 1024`
        echo "TX $1: $TKBPS kB/s RX $1: $RKBPS kB/s"
done

अधिक जानकारी के लिए इस साइट का उल्लेख http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html


यह "विशिष्ट पोर्ट या एप्लिकेशन प्रोसेसआईडी" के लिए एक संभव समाधान नहीं है क्योंकि यह आपको प्रति इंटरफ़ेस की दर देता है।
मेने

6

आउटपुट को नियंत्रित करने के लिए सबसे आसान और आसान और निरंतर लॉगिंग के लिए फ़ाइल को रीडायरेक्ट करना:

ifstat

संभवतः अधिकांश लिनक्स वितरण के साथ आता है, और मैक पर काढ़ा के साथ स्थापित किया जा सकता है


उसके लिए धन्यवाद। मैक के साथ अन्य लोग कैसे निष्पक्ष होते हैं? मैं ifstat स्थापित करने की कोशिश करता हूं और देखता हूं कि यह कैसे जाता है। कुछ और जानकारी निश्चित रूप से उपयोगी रही होगी।
nyxee

3

मुझे लगता है कि आप अपनी ज़रूरत की जानकारी प्राप्त करने के लिए proc इंटरफ़ेस का उपयोग कर सकते हैं। मैंने इस छोटे शेल स्क्रिप्ट को rt_traf.sh कहा:

#!/bin/bash

cat /proc/$1/net/netstat | grep 'IpExt: ' | tail -n 1 | awk '{ print $8 "\t" $9 }'

यह एक टैब द्वारा अंदर और बाहर ओकटेट्स को प्रिंट करेगा। 8 से गुणा किए गए ओकटेट्स आपको बिट्स / सेकंड देंगे और फिर 10 ^ 6 से विभाजित करके आपको मेगाबिट्स / सेकंड देंगे। बेशक आप इसे शेल स्क्रिप्ट में जोड़ सकते हैं आउटपुट को प्रारूपित करने के लिए कि आप इसे कैसे चाहते हैं। आप इसे अपने एप्लिकेशन के PID के साथ कॉल कर सकते हैं, जिससे ./rt_traf.sh <PID>आपको स्टार्टअप के बाद से आपके आवेदन का तुरंत पढ़ने में मदद मिलेगी। वास्तविक समय आँकड़े प्रति सेकंड देखने के लिए आप वॉच कमांड में शेल स्क्रिप्ट लपेट सकते हैं:

watch -n 1 ./rt_traf.sh <PID>

-nपैरामीटर एक दूसरे का दसवां करने के लिए नीचे सभी तरह से समायोजित किया जा सकता। समय के साथ एक गणना करने के लिए मैं ऐसा कुछ करूंगा:

PID=<PID>; START=`./rt_traf.sh $PID`;IN_START=`echo $START | awk '{ print $1 }'`; OUT_START=`echo $START | awk '{ print $2 }'`; sleep 10; END=`./rt_traf.sh $PID`; IN_END=`echo $END | awk '{ print $1 }'`; OUT_END=`echo $END | awk '{ print $2 }'`; IN_BPS=`echo "scale=2; (($IN_START-$IN_END)/10)/8" | bc`; OUT_BPS=`echo "scale=2; (($OUT_START-$OUT_END)/10)/8" | bc`; echo "In: " $IN_BPS "Bits/second"; echo "Out: " $OUT_BPS "Bits/second"

फिर से गणित को आपके लिए आवश्यक आकार / समय के लिए समायोजित किया जा सकता है। सबसे सुरुचिपूर्ण या लिपटे लिपटे समाधान नहीं है, लेकिन यह एक चुटकी में काम करना चाहिए।


3
ये गलत है। / proc / <PID> / net / netstat में प्रक्रिया डेटा नहीं है।
नाब

नब की टिप्पणी पर विस्तार करने के लिए: के /proc/<pid>/net/netstatरूप में एक ही डेटा देता है proc/net/netstat, यानी। आपको किसी भी / सभी प्रक्रियाओं के लिए समान डेटा मिलता है।
EML

2

मुझे यह मापने की जरूरत है कि एक पुराने सिस्टम पर mysql का ट्रैफिक कितना चल रहा है और जहां पर्ल सही तरीके से काम नहीं कर रहा है, इसलिए मैं awk की कुछ पंक्तियों को लिखने का विरोध नहीं कर सका, जो tcpdump द्वारा देखे गए कुल ट्रैफिक को मापने के समान लक्ष्य की सेवा करते हैं:

# tcpdump -l -e -n port 3306 | \
  awk '{
  t=substr($1, 0, 8);
  n=substr($9, 0, length($9)-1);
  if(t != pt){
    print t, sum;
    sum = 0;
  } else {
    sum += n
  }
  pt=t;
}'

tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:41:54 
14:41:55 466905
14:41:56 765220
14:41:57 741511
14:41:58 688219
14:41:59 492322
14:42:00 800087
14:42:01 1248608
14:42:02 1276476
14:42:03 755586
14:42:04 1029453
14:42:05 818298
^C32515 packets captured
32633 packets received by filter
107 packets dropped by kernel

और अगर आपको वन-लाइनर्स बेहतर लगते हैं, तो यहां आपके लिए एक है:

tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;}else{sum+=n}pt=t;}'

elseबयान अन्यथा हटाया जाना चाहिए लाइनों को छोड़ दिया जाएगा, और sumसही नहीं होगा। tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;};sum+=n;pt=t;}
डेविड

0

प्रति आवेदन xtables और नीचे के संशोधन का उपयोग करके एक फ़ायरवॉल नियम के साथ किया जा सकता है।

यह "प्रति एप्लिकेशन" प्रश्न का उत्तर नहीं देता है, लेकिन केवल "प्रति इंटरफ़ेस" एक है।

नीचे एक स्क्रिप्ट है जो अधिकांश एम्बेडेड लिनक्स राउटर जैसे कि यूबिकिटि और ओपनडब्ल्यूआरटी संगत पर काम करता है और इसकी जानकारी / proc / net / dev से प्राप्त करता है।

(और पैकेट आदि को बदलना आसान)

#!/bin/sh

SLP=1 # output / sleep interval
DEVICE=$1
IS_GOOD=0
for GOOD_DEVICE in `grep \: /proc/net/dev | awk -F: '{print $1}'`; do
    if [ "$DEVICE" = $GOOD_DEVICE ]; then
        IS_GOOD=1
        break
    fi
done

if [ $IS_GOOD -eq 0 ]; then
    echo "Device not found. Should be one of these:"
        grep ":" /proc/net/dev | awk -F: '{print $1}' | sed s@\ @@g 
    exit 1
fi

while true; do

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED1=`echo $LINE | awk '{print $1}'`
TRANSMITTED1=`echo $LINE | awk '{print $9}'`
TOTAL=$(($RECEIVED1+$TRANSMITTED1))

sleep $SLP

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED2=`echo $LINE | awk '{print $1}'`
TRANSMITTED2=`echo $LINE | awk '{print $9}'`
SPEED=$((($RECEIVED2+$TRANSMITTED2-$TOTAL)/$SLP))
INSPEED=$((($RECEIVED2-$RECEIVED1)/$SLP))
OUTSPEED=$((($TRANSMITTED2-$TRANSMITTED1)/$SLP))

printf "In: %12i KB/s | Out: %12i KB/s | Total: %12i KB/s\n" $(($INSPEED/1024)) $(($OUTSPEED/1024)) $((($INSPEED+$OUTSPEED)/1024)) ;

done;

ऊपर अपने क्लिपबोर्ड पर और फिर अपने राउटर पर एक टर्मिनल सत्र में कॉपी करें:

$ cat > /tmp/n.sh

तब: Ctrl + V (या राइट क्लिक / पेस्ट)

तब: Ctrl + D

$ chmod +x /tmp/n.sh

$ /tmp/n.sh eth0

आप इसे एक नोटपैड में भी पेस्ट कर सकते हैं, फिर उपरोक्त को दोहराएं यदि आपको इसे संपादित करने की आवश्यकता है - सभी एम्बेडेड राउटर में संपादक नहीं है! सुनिश्चित करें कि आपने शीर्ष पर # से सब कुछ कॉपी किया है; तल पर।

ऊपर दिए गए नेटपैप उदाहरण बीटीडब्ल्यू महान हैं - लेकिन सभी उपकरणों में एक माउंटेड / एसआईएस फाइल सिस्टम नहीं है। आपको / bin / bash को / bin / sh या इसके विपरीत बदलना पड़ सकता है।

स्रोत: https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549


कृपया एक से अधिक प्रश्नों के उत्तर एक ही न दें। यदि समान जानकारी वास्तव में दोनों प्रश्नों का उत्तर देती है, तो एक प्रश्न (आमतौर पर नया एक) दूसरे के डुप्लिकेट के रूप में बंद होना चाहिए। आप इसे एक डुप्लिकेट के रूप में बंद करने के लिए मतदान द्वारा इंगित कर सकते हैं या, यदि आपके पास इसके लिए पर्याप्त प्रतिष्ठा नहीं है, तो यह इंगित करने के लिए कि यह एक डुप्लिकेट है, झंडा उठाएं । अन्यथा इस सवाल के अपने जवाब को दर्जी करें और एक ही उत्तर को कई स्थानों पर पेस्ट न करें।
DavidPostill

आपने मेरी अन्य पोस्ट पर ठीक वैसी ही टिप्पणी पोस्ट की ... जो आकस्मिक रूप से अनुकूलित थी ... इस तरह की प्रतिक्रिया से मुझे आश्चर्य होता है कि मुझे यहां योगदान करने में समय क्यों लगा।
1918

यदि इसे अनुकूलित किया गया था, तो सिस्टम द्वारा पोस्ट को स्वत: स्फूर्त करने के बाद हुआ था। मेरे पास यह देखने के लिए हर शब्द पढ़ने का समय नहीं है कि वे अनुकूलित हैं या नहीं।
DavidPostill

1
आपके द्वारा किया गया एकमात्र अनुकूलन आपके aser की शुरुआत में दो वाक्य जोड़ना था। शेष समान लगता है। और वे दो वाक्य पोस्ट किए गए मूल उत्तर में नहीं थे - यही वजह है कि इसे स्वचालित रूप से एक नकली उत्तर के रूप में चिह्नित किया गया था।
DavidPostill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.