Wie kann ich mit dem Ping-Befehl eine kurze Zeitüberschreitung einstellen?


49

Ich versuche ein Skript zu schreiben, das alle Hosts in meinem LAN auflistet (es gibt ungefähr 20 davon) und den Ping-Status neben jeden Host schreibt. Ich habe die DHCP-Leases-Datei, habe also alle IPs (z. B. 10.0.0.1, 10.0.0.2 usw.) und benötige nur den Ping-Status für jeden Host.

Also startet mein Skript einen einzelnen Ping für jeden Host:

ping -c 1 10.0.0.1

Wenn ein Host offline ist, dauert der Ping-Vorgang leider sehr lange. Ich habe überprüft man ping, dass es anscheinend zwei Optionen gibt, um die Zeitüberschreitungsverzögerung einzustellen: -w deadlineund -W timeout. Ich glaube, ich interessiere mich für Letzteres.

Also habe ich Folgendes versucht:

ping -c 1 -W 1 10.0.0.1

Das Warten auf eine Sekunde pro Offline-Host ist jedoch immer noch zu lang. Ich habe versucht, einen Wert unter einer Sekunde festzulegen, aber der Parameter scheint überhaupt nicht berücksichtigt zu werden:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

Gibt es eine Möglichkeit, das Timeout auf einen niedrigeren Wert einzustellen? Wenn nicht, gibt es Alternativen?

Bearbeiten

  • Das Betriebssystem ist Debian Lenny.
  • Die Hosts, die ich anpingen möchte, sind tatsächlich Zugriffspunkte. Sie befinden sich im selben VLAN und Subnetz wie die Benutzer (zur Vereinfachung der Bereitstellung und des Austauschs). Aus diesem Grund möchte ich nicht das gesamte Subnetz scannen ( ping -bzum Beispiel mit einem ).

Bearbeiten Sie # 2

Ich habe die fpingLösung angenommen (danke für alle anderen Antworten). Dieser Befehl macht genau das, wonach ich gesucht habe:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Dieser Befehl dauert höchstens 500 ms und zeigt den Ping-Status aller Hosts gleichzeitig an:

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

Unter Debian Lenny ist die Installation trivial:

aptitude update
aptitude install fping

Antworten:


41

Fping ist möglicherweise ein besseres Tool als der von Ihnen verwendete Ping. Auf welchem ​​Betriebssystem bist du?

  • "fping unterscheidet sich von ping dadurch, dass Sie eine beliebige Anzahl von Zielen in der Befehlszeile oder eine Datei angeben können, die die zu pingenden Ziellisten enthält."
  • "Anstatt an ein Ziel zu senden, bis es abgelaufen ist oder antwortet, sendet fping ein Ping-Paket und wechselt im Round-Robin-Verfahren zum nächsten Ziel."
  • "Im Gegensatz zu Ping ist fping für die Verwendung in Skripten gedacht, sodass die Ausgabe einfach zu analysieren ist."

1
Funktioniert super, danke, das habe ich gesucht. Dieser Befehl erledigt die Aufgabe einwandfrei: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Das Ganze dauert eine halbe Sekunde und ich erhalte die Ergebnisse für alle Hosts auf einmal. Hervorragendes Werkzeug. :-))
MiniQuark

37

pingVerwenden Sie den -iSchalter, wenn Sie nach einer entsprechenden Lösung suchen .

ping -i 0.2 www.google.com

Wenn Sie 0.1 verwenden möchten, müssen Sie es als root ausführen

sudo ping -i 0.1 www.google.com

Es müssen keine zusätzlichen Dienstprogramme heruntergeladen werden.


4
+1 von mir. Dies ist das erste Ergebnis, wenn ich "Ping Timeout" google, und genau das habe ich gesucht.
Steven Jeffries

@StevenJeffries Gleiche hier!
Luc

1
Im Falle eines toten Hosts druckt diese Lösung nach ca. 1 Sekunde ihre erste nützliche Ausgabe. Dies ist definitiv eine falsche Antwort, da @MarcelBurkhard bereits erwähnt wurde.
Victor Yarema

1
Das Problem bei dieser Lösung ist, dass -i 0.1 NICHT 100 ms, sondern länger auf Pings wartet, die länger als 100 ms dauern, wodurch sich das Timing verschiebt.
Lamageddon

2
Diese Antwort ist falsch - es ändert sich nicht, wie lange pingauf eine Antwort gewartet wird - es werden nur schnellere aufeinanderfolgende Pings
gesendet

21

Sie können eine kurze Zeitüberschreitung mit dem timeoutBefehl unter Ubuntu / Debian einstellen :

timeout 0.2 ping -c1 fqdn || { do_work }

Gute Antwort! Das habe ich jetzt gemacht: timeout 1 ping -c 1 test.com
vrijdenker

1
Meine Timeout-Version akzeptiert nur 1 Sekunde. timeout (GNU coreutils) 8.4.
SLM

Ich mag diese Lösung, es kann auf alle anderen Befehle angewendet werden
datdinhquoc

@slm, es ist seltsam, dass deine Version nicht weniger als eine Sekunde unterstützt. Es funktioniert für mich: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... In meinen man timeoutFallberichten GNU coreutils 8.26. BWT, ich benutze Ubuntu 17.04.
Victor Yarema

Dies ist eigentlich das einzige, was funktioniert, wenn Sie Timeouts verringern möchten (Host antwortet nicht).
Marki

13

Ich würde nmap für diese Aufgabe verwenden.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Weitere Informationen hierzu finden Sie in der nmap-Dokumentation .


Guter Anruf .. Dies ist die "Awesome"
-Methode

Hallo, ich habe es gerade versucht, habe aber die folgende Fehlermeldung erhalten: "--host-timeout wird in Millisekunden angegeben, sofern Sie es nicht durch Anhängen von 's', 'm', 'h' oder 'd' qualifizieren. Der Wert muss größer als 1500 Millisekunden sein ".
MiniQuark

Ich denke, das Problem liegt auf der Hand, das Timeout kann nicht kürzer als 1500ms sein. Dann sollten Sie nach den nmap-Optionen für die Parallelität suchen, denke ich.
Pacey

Dies scheint nur eine Anfrage zu senden. Ich bin auf der Suche nach kontinuierlicher Fehlererkennung, ich habe hier durch Googeln "Ping Millisekunden Timeout" bekommen. Bietet nmap Infinie-Pings wie Ubuntu Ping?
ThorSummoner

Wenn Sie das Zeitlimit auf weniger als eine Sekunde einstellen, müssen Sie einen privilegierten Benutzer wie in @ victor-bjelkholm answer
thrau

4

Möglicherweise möchten Sie das Arp-Ping-Tool überprüfen, wenn sich alle Ihre Hosts im physischen LAN befinden. Es führt dasselbe aus, verwendet jedoch Layer-2-Arp-Pakete, um das 'Ping' auszuführen. Sie können eine Kombination aus Arpping und ICMP-Ping oder TCP-Ping verwenden, um den Fehler zu ermitteln. Ein Beispiel ist ein Absturz des TCP-Stacks. Obwohl dies heutzutage selten vorkommt, können wir feststellen, dass ein TCP-Stapel eines Rechners abgestürzt ist, da der Rechner nicht auf Ping reagiert, jedoch auf ARP (ein anderer Code auf dem Host). .

mit einer kombination von arpping, tcpping und icmp ping können sie herausfinden, ob der dienst auf der maschine abgestürzt ist, der tcp-stapel abgestürzt ist oder die maschine vollständig abgestürzt ist. Wenn Sie Ethernet-Switches verwaltet haben, können Sie physische Verbindungsdaten abrufen, die Aufschluss darüber geben, ob der Computer tatsächlich eingeschaltet ist oder physisch vom Stromnetz getrennt wurde. Wir hatten eine Situation, in der Maschinen (Clients in öffentlichen Räumen) ausgeschaltet waren. Wir sammelten diese Daten und die gesendeten Wake-on-LAN-Pakete, um die Maschinen einzuschalten. :-)

Was auch immer Sie für Lösungen entwickeln, wenn Ihr Netzwerk ausgelastet ist, denken Sie daran, eine Art von Qo zu implementieren, damit Ihre Überwachungspakete Priorität im Netzwerk haben. Der Verlust von Messpaketen aufgrund von Netzwerküberlastung kann zu Fehlalarmen führen. Wenn Sie qos zum Überwachen von Paketen verwenden, müssen Sie über das Sammeln von Daten zur Netzwerknutzung nachdenken.

So können Sie Ihre Überwachungslösung so komplex oder einfach gestalten, wie Sie möchten. Wir finden, dass selbst das elementarste Überwachungssystem ein Schritt in die richtige Richtung ist, zumindest haben einige Administratoren die Maschinen im Auge :-).

Viel Glück!


3

@ jordon-bedwell hat einen tollen vorschlag.

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux erklärt, dass Ping-Timeouts erst starten, nachdem die IP-Adresse ermittelt wurde. Wenn Sie eine DNS verwenden und Ihre Workstation offline ist, kann ping die IP-Adresse nicht ermitteln und scheint daher ungefähr 20 Sekunden oder länger zu warten, bevor false zurückgegeben wird.

Die Verwendung des Linux-Timeout-Tools bietet mehr Kontrolle beim Ausführen von Ping mit einem Domain-Namen.

Danke Leute


2

Verwenden Sie den Schalter -w sowohl unter Windows als auch unter Debian.

Auf diese Weise können Sie schnell überprüfen, ob das Gerät überhaupt reagiert, vorausgesetzt, es reagiert in weniger als der angegebenen Zeit in Sekunden.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

1

Wenn Sie Ihr Subnetz (oder einen Teil davon) scannen können, ohne Sicherheitsalarme auszulösen, und sich nicht um ein bisschen zusätzliche Daten kümmern, ist Angry IP Scanner schnell und kostenlos. Sie können per Mausklick nach Status sortieren und detailliertere Informationen bereitstellen .


0

Warum nicht für jeden Host gleichzeitig Ping im Hintergrund starten und in eine temporäre Datei ausgeben? Gehen Sie dann für eine Sekunde in den Ruhezustand, beenden Sie alle noch ausgeführten Ping-Prozesse und lesen Sie die Dateien, um die Ausgabe zu erfassen.


1
Ich denke, es würde funktionieren, aber ich suchte nach einer einfacheren Lösung. Danke trotzdem.
MiniQuark

Diese Methode skaliert nicht.
Synetech

0

Das Timeout ist ein ganzzahliger Wert, der angibt, wie lange und wie weit das Paket gesendet werden kann. Werte unter 1 sind bedeutungslos. Der Wert 1 gibt an, dass Sie nur unmittelbare Nachbarn anpingen.

Die einzige Möglichkeit, die Dinge zu beschleunigen, besteht darin, eine Hintergrundüberprüfung durchzuführen und die Ergebnisse zu sammeln. Dies ist, was Werkzeuge wie Nagios tun.


1
Es tut mir leid, aber ich glaube wirklich nicht, dass dies wahr ist. Der Manpage ist ziemlich klar, dass -W die "Wartezeit auf eine Antwort in Sekunden" angibt; Es ist nicht dimensionslos, und obwohl Ping Werte unter 1 (daher die Frage) nicht berücksichtigt, sind Timeouts unter einer Sekunde nicht bedeutungslos. Wenn Sie mir verzeihen, können Sie -W mit -t verwechseln. Letzteres setzt das IP-TTL-Feld (Hop Count), das sich so verhält, wie Sie es beschrieben haben, und bei dem Werte unter 1 in der Tat bedeutungslos sind.
MadHatter

-W ist die Zeit, in der der Ping-Prozess auf eine Antwort wartet, und es kann sinnvoll sein, sie deutlich unter die Sprungzahl zu setzen, wenn die Sprungzahl hoch ist, was normalerweise der Fall ist. Nach drei Sekunden befinden Sie sich normalerweise in einem Wiederholungszustand. Einige Tools erlauben möglicherweise die Verwendung eines feinkörnigeren Timers für Wartezeiten, aber für die meisten Ping-Anwendungen sind Sekunden eine vernünftige Einheit.
BillThor

0

Sie könnten so etwas versuchen. Die Laufzeit beträgt jedoch 15 Minuten.

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a=`expr $a - 1`
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log

Sieht aus wie nmapwäre das richtige Werkzeug für den Job.
Kasperd


-1

Ping hat die Optionen [-t Timeout] und [-W Wartezeit], so dass Sie Folgendes tun können:

ping -c 1 -t 1 -W 1 google.com
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.