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:

~/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

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