Linux Ping: Timeout anzeigen

17

Wie kann ich den Linux-Ping veranlassen, das Timeout der Anforderungen anzuzeigen, anstatt die Ausgabe auszulassen?

Genau wie die Windows-Version von Ping.

Andre
quelle
Wie gehen Sie nicht zeigen , das Timeout?
Michael

Antworten:

12

fping hat bei mir nicht funktioniert ... In meinem Fall möchte ich meistens sehen, dass dies im Grunde genommen während des Neustarts des Servers geschieht ... das funktioniert unter Windows ziemlich gut ...

Ich erstelle ein einfaches Skript (erweitere @entropo answer), das mir dabei hilft, diese Frage zu beantworten:

https://gist.github.com/brunobraga/7259197

#!/bin/bash

host=$1

if [ -z $host ]; then
    echo "Usage: `basename $0` [HOST]"
    exit 1
fi

while :; do
    result=`ping -W 1 -c 1 $host | grep 'bytes from '`
    if [ $? -gt 0 ]; then
        echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;31mdown\033[0m"
    else
         echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;32mok\033[0m -`echo $result | cut -d ':' -f 2`"
        sleep 1 # avoid ping rain
    fi
done

Und Nutzung ist so etwas wie:

Bildbeschreibung hier eingeben

bruno.braga
quelle
Können Sie es bitte ändern, um den Prozentsatz des Paketverlusts zu melden und in jeder Zeile zu zählen?
Pol Hallen
21

Das Beste, was ich gefunden habe, war die Verwendung des Flags -O (Beachten Sie, dass es nicht auf allen Distributionen funktioniert - mit Linux Mint 17.1 Rebecca IPUTILS-PING 3: 20121221-4ubuntu1.1)

$ ping -O 10.10.5.1

64 bytes from 10.10.5.1: icmp_seq=53 ttl=245 time=460 ms
no answer yet for icmp_seq=54
64 bytes from 10.10.5.1: icmp_seq=55 ttl=245 time=265 ms
64 bytes from 10.10.5.1: icmp_seq=56 ttl=245 time=480 ms
no answer yet for icmp_seq=57
64 bytes from 10.10.5.1: icmp_seq=58 ttl=245 time=348 ms
64 bytes from 10.10.5.1: icmp_seq=59 ttl=245 time=515 ms
no answer yet for icmp_seq=60
64 bytes from 10.10.5.1: icmp_seq=61 ttl=245 time=320 ms
64 bytes from 10.10.5.1: icmp_seq=62 ttl=245 time=537 ms

Von der Manpage:

-O Report outstanding ICMP ECHO reply before sending next packet. This is useful together with the timestamp -D to log output to a diagnostic file and search for missing answers.

Scoy
quelle
Hallo Scoy, willkommen bei Super User und vielen Dank für die Antwort auf diese Frage! Dies scheint abhängig von der Version von zu sein ping; Auf Debian Wheezy bekomme ich " ping: invalid option -- 'O'", aber auf Jessie funktioniert es, wie Sie notieren. Möglicherweise möchten Sie Ihre Antwort aktualisieren, um diese Informationen einzuschließen. (Ich habe auch eine vorgeschlagene Bearbeitung eingereicht, um vorformatierten Text für die Ausgabe und die Informationen aus der Manpage zu verwenden)
Bertieb
5

Wenn ich Ping verwende, um festzustellen, ob ein Host in Shell-Skripten aktiv ist, gehe ich folgendermaßen vor:

ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up

Grundsätzlich wird in einer Sekunde ein ICMP-Timeout ohne Ausgabe gesendet und der Exit-Code verwendet, um weitere Aktionen zu steuern.

Entropo
quelle
2

Es gibt keine Möglichkeit für die Allgemeinheit ping, dies zu tun. Wenn Sie versuchen, ein Skript zu erstellen, haben Sie folgende Optionen:

ping -c 2 <ip>
RESULT=$?
echo $RESULT
1

Wenn der Ping fehlschlägt, $?ist 1, wenn der Ping erfolgreich ist, $?ist 0.

Die andere Option fpingfunktioniert ähnlich wie bei Cisco ping:

$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive

quelle
2

Das obige Skript von bruno.braga funktioniert einwandfrei, ich persönlich bevorzuge jedoch die Verwendung eines Alias ​​in einem Shell-Profil (wie .bashrc), damit es ein alltäglicher Anwendungsfall sein kann.

Meine unten stehende Lösung berechnet auch automatisch die ECHO-Anforderungssequenznummer:

alias pingt='__pingt() { s=0; while :; do s=$(($s+1)); result=$(ping $1 -c1 -W1 |/bin/grep from) && echo "$result, seq=$s" && sleep 1 || echo timeout; done }; __pingt $1'

Hier ist das Ausgabebeispiel, wenn der Host mit einer Zeitüberschreitung instabil ist:

$ pingt 10.10.10.126
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.235 ms, seq=1
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.228 ms, seq=2
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.209 ms, seq=3
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.241 ms, seq=4
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.195 ms, seq=5
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.211 ms, seq=6
timeout
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.267 ms, seq=8
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.232 ms, seq=9
^C

Der Nachteil ist natürlich: Keine Statistik am Ende, wenn STRG-C gedrückt wird. Auf Wunsch ist es auch möglich, min / avg / max per Shell-Skript zu berechnen, mdev sprengt jedoch den Rahmen.

Jackie Yeh
quelle
1

Ich fürchte, aber es gibt keine 100% ige Lösung für dieses Problem mit Standard-Ping. Sogar mit ping -v für die ausführliche Ausgabe würde ping im Falle von Zeitüberschreitungen stumm bleiben. Sie könnten versuchen, Folgendes zu verwenden:

ping -w 2 192.168.199.1
PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data.

--- 192.168.199.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms

Dies würde nach 2 Sekunden aufhören zu pingen und dann die Anzahl der übertragenen Pakete und den Paketverlust anzeigen. Eine andere Möglichkeit wäre die Verwendung von mtr .


quelle
1
nomad@local:~$ fping -l -e 8.8.8.8

8.8.8.8 : [0], 92 bytes, 183 ms (183 avg, 0% loss)
8.8.8.8 : [1], 92 bytes, 61.4 ms (122 avg, 0% loss)
8.8.8.8 : [2], 92 bytes, 164 ms (136 avg, 0% loss)
8.8.8.8 : [3], 92 bytes, 163 ms (143 avg, 0% loss)
8.8.8.8 : [5], 92 bytes, 158 ms (146 avg, 16% loss)
8.8.8.8 : [6], 92 bytes, 122 ms (142 avg, 14% loss)
8.8.8.8 : [7], 92 bytes, 134 ms (141 avg, 12% loss)
8.8.8.8 : [8], 92 bytes, 130 ms (140 avg, 11% loss)

nomad@local:~$ fping -version
fping: Version 3.2
fping: comments to [email protected]
nvluan
quelle
Beachten Sie jedoch, dass sporadisch auftretende Zeitüberschreitungen nach einigen Minuten keine Auswirkung auf den Druckverlust haben (1 Paket von 1000 ist ein Verlust von 0,1%, und beim Drucken von fp werden weiterhin 0% ausgegeben). Ganz zu schweigen davon, dass es weitaus einfacher ist, ein "Anforderungs-Timeout" zu bemerken, als die Zeit zu
erfassen
fpingist gut, und BTW das -eist nicht notwendig, wenn -loder -chinzugefügt wird, könnte nur verwenden fping -l 8.8.8.8, die Ausgabe ist die gleiche.
Eric Wang
0

Ich mag das Shell-Skript von Bruno sehr. Ich habe eine Zeile hinzugefügt, um eine Datei mit allen Fehlern zu erstellen.

echo -e " date +'%Y/%m/%d %H:%M:%S'- host $ host ist \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt

Dave Honsvick
quelle
0

Ohne etwas zu schreiben

ping -f -i 1 hostname

Vorteile : Standard Linux Kommando - nichts zu installieren oder zu skripten.

Nachteile :

  1. Für Pakete, die erfolgreich beantwortet wurden, wird NICHTS gedruckt
  2. Bei Paketen, die erfolgreich beantwortet wurden, ertönt ein nerviger Piepton
  3. Die visuelle Anzeige von Zeitüberschreitungen ist so gering wie möglich (ein kleiner Punkt bleibt auf dem Bildschirm, wenn ein Paket abgelaufen ist).

Mit einem minimalen Skript

#!/bin/bash
while :; do
    ping -W1 -c 1 "$@" | grep 'bytes from '
    case $? in
        0 ) sleep 1 ;;
        1 ) echo -e "request timeout" ;;
        * ) exit ;;
    esac
done

Nachteile : Sie erhalten am Ende keine Statistik und können diese 3 Ping-Optionen nicht verwenden:

  1. -i Ändern des Intervalls zwischen dem Senden von Paketen (fest auf 1 Sek. codiert)
  2. -W um das Timeout zu ändern (es ist fest auf 1sec codiert)
  3. -c nach dem Senden von N Paketen zu stoppen

Übrigens: Dies ist eines der äußerst seltenen Beispiele für Funktionen, die ich in einem Linux-CLI-Tool wirklich vermisse, aber in einem Windows-Tool finde. Die Hinrichtung, die die Regel beweist, wie sie sagen :-)

ndemou
quelle
0

Wenn Sie einen kontinuierlichen Ping wie bei Windows und mit Zeitstempel ausführen möchten, verwenden Sie diesen. Fühlen Sie sich frei, durch 192.168.0.1Ihre eigene IP-Adresse zu ersetzen

while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done

Beispiel Antwort OK

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:49 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:50 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:51 GMT 2018 >>> Reply OK
^Z
[23]+  Stopped                 sleep 1
[user@Linux ~]$

Beispiel Zeitüberschreitung bei der Anforderung

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.254 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:36 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:37 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:38 GMT 2018 >>> Request timed out
^Z
[22]+  Stopped                 ping -c 1 -t 1 192.168.0.254 >/dev/null
[user@Linux ~]$ 
Sabrina
quelle
0

Der normale Ping zeigt tatsächlich Timeouts an. Anhand des Wertes seq = zwischen den Pings können Sie erkennen, wie viele Timeouts auftreten

64 bytes from 192.168.12.46: icmp_seq=8 ttl=62 time=46.7 ms
64 bytes from 192.168.12.46: icmp_seq=11 ttl=62 time=45.3 ms

EG 3 Timeouts traten zwischen den obigen 2 Pings auf, da der erste seq=8und der zweite Timeout waren seq=11 (9 und 10 waren Timeouts) seq=sequence.

Clive Gerada
quelle