Kleines Shell Script als Erweiterung zum Standard Linux Ping Tool. Die Genauigkeit habe ich nicht getestet, es soll nur zur Einschätzung von Packetloss und Jitter dienen.
eping <host> [ping Options]
Kleinster Intervall liegt bei etwa -i 0.05
= 50ms, ggf. ist durch Optimierung des Scrips noch etwas mehr möglich.
Ohne [ping Options]
ist der Default Intervall 200ms (-i 0.2
)
Beispiel:
1 2 |
~/pp # ./eping 10.0.0.1 -i 1 - req=6 last=6 c=6 l=0 sv=0 rtt(cur|avg|min|max)=14.3 13.8 13.4 14.3 jitter(c|min|max)=720 600 720 us |
Bash Script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#!/bin/bash LANG=C IP=$1 INTERVALL=0.2 PINGOPT="-i $INTERVALL" shift [ "_$1" == "_" ] || PINGOPT="$@" let count=0 let last_req=0 let loss=0 let run=1 rtt=0 lastrtt=0 rttmax=0 rttavg=0 rttmin=10000000 let jitterdiff=0 let jitter=0 let jittermin=10000 let jittermax=0 let seqvio=0 trap "run=0" INT [ -z $TMPDIR ] && TMPDIR=/tmp pipe1=$TMPDIR/$(basename $0).pipe rm -f $pipe1 if [[ ! -p $pipe1 ]]; then mkfifo $pipe1 fi wd_pp() { while [ -p $2 ]; do eval $1 # [ $? -eq 0 ] && break sleep 0.2 done } wd_pp "ping $PINGOPT $IP >$pipe1" $pipe1 & x='|/-\' starttime=$(date '+%Y%m%d %H:%M:%S') while [ $run -eq 1 ]; do if read line <$pipe1; then t=$(date +%Y%m%d_%H:%M:%S.%N) if [[ "$line" == 'quit' ]]; then break fi # echo $line | grep -v "PING" | cut -d':' -f2 | sed 's/ms//g' | sed 's/ /;/g' | sed 's/^;//g' | sed 's/;$//g' | sed 's/icmp_seq/icmp_req/g' eval $(echo $line | grep -v "PING" | cut -d':' -f2 | sed 's/ms//g' | sed 's/ /;/g' | sed 's/^;//g' | sed 's/;$//g' | sed 's/icmp_seq/icmp_req/g' ) # echo "icmp_req=$icmp_req" [ "$icmp_req" == "" ] && continue [ $run -eq 0 ] && continue rtt=$(echo "$rtt + $time * 1000" | bc -l) utime=$(echo "$time * 1000" | bc | cut -d'.' -f1) if [ $count -gt 0 ]; then if [ $icmp_req -lt $(( last_req + 1 )) ]; then let seqvio=seqvio+1 elif [ ! $icmp_req -eq $(( last_req + 1 )) ]; then let loss=loss+1 fi [ $utime -gt $lastrtt ] && let jitterdiff=$jitterdiff+$utime-$lastrtt || let jitterdiff=$jitterdiff+$lastrtt-$utime jitter=$(echo "$jitterdiff/$count" | bc -l | cut -d'.' -f1) fi let last_req=$icmp_req lastrtt=$utime let count=count+1 rttavg=$(echo "$rtt / 1000 / $count" | bc -l | cut -b1-4) rttime=$(printf "%.0f" $(echo "$time * 1000" | bc -l)) [ $rttime -gt $rttmax ] && rttmax=$rttime [ $rttime -lt $rttmin ] && rttmin=$rttime [ $jitter -gt $jittermax ] && jittermax=$jitter [ $jitter -gt 0 ] && [ $jitter -lt $jittermin ] && jittermin=$jitter y=$(($count%4)); echo -ne "${x:y:1} req=$icmp_req last=$last_req c=$count l=$loss sv=$seqvio rtt(c|a|min|max)=$time $rttavg $(echo "$rttmin/1000" | bc -l | cut -b1-4) $(echo "$rttmax/1000" | bc -l | cut -b1-4) " echo -ne "jitter(c|min|max)=$jitter $jittermin $jittermax us \r" fi read -n 1 -t 0.005 -s k case $k in q|Q) run=0;; c|C) jittermin=10000; jittermax=0; rttmin=10000000; rttmax=0; loss=0; seqvio=0;; esac done endtime=$(date '+%Y%m%d %H:%M:%S') rm -f $pipe1 echo -ne "\r \n" echo "Test start: $starttime" echo "test end: $endtime" echo "Ping Options '$PINGOPT'" echo "Loss $loss/$count = $(echo "$loss * 100 /$count" | bc -l | cut -b1-4)%" echo "RTT avg $rttavg" echo "RTT min $(echo "$rttmin/1000" | bc -l | cut -b1-4)" echo "RTT max $(echo "$rttmax/1000" | bc -l | cut -b1-4)" echo "Jitter $jitter us (10^-6)" echo "Jitter min $jittermin us (10^-6)" echo "Jitter max $jittermax us (10^-6)" |