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)"