Schneller als Ping, um zu überprüfen, ob der Computer online ist?

20

Ich schreibe ein Wake-on-Lan-Skript für einen Satz unserer Laborcomputer. Wir haben sqlite db mit einer Liste der Computer-Hostnamen, -IPs und -MACs und momentan pinge ich jeden mit '-c1', damit er nicht endlos läuft - aber selbst wenn man etwas warten muss, gibt es einen schnelleren Weg, ihn zu bekommen eher antworten als pingen? Die Verwendung von Ping scheint das Skript ziemlich zu verlangsamen, da Ping-Antworten erforderlich sind, um fortzufahren.

Vielen Dank für alle Vorschläge!

Jon Phenow
quelle

Antworten:

20

Das Senden eines einzelnen Pakets und das Warten auf eine Antwort wird eine der schnellstmöglichen Möglichkeiten sein, und Ping ist eine gute Möglichkeit, dies zu tun. Abhängig von Ihrem Anwendungsfall würde ich behaupten, dass es zu schnell ist , da es Ihnen nicht wirklich sagt, ob das System tatsächlich etwas Nützliches tut, sondern nur, dass das Netzwerk-Subsystem des Kernels aktiv und konfiguriert ist.

Aber wenn das gut genug ist, können Sie einige Verbesserungen vornehmen. Erstens können Sie -W1das Ping-Zeitlimit auf eine Sekunde verringern. Zweitens können Sie Ihr Skript dazu bringen, die verschiedenen Hosts asynchron zu pingen (in einem Hintergrund-Thread) und die Ergebnisse nach Bedarf zu überprüfen, anstatt zu warten.

Alternativ können Sie den Ansatz überdenken und die Remote-Systeme irgendwie einchecken lassen, wenn sie in Betrieb sind. Wenn ein System nicht eingecheckt hat, können Sie davon ausgehen, dass es inaktiv ist.

mattdm
quelle
Guter Anruf auf der -w-Seite, musste es aber zu zwei machen, da ein Haufen Computer nicht schnell genug reagierte. Vielleicht möchten Sie auch eine Art periodisches Einchecken oder Hand-Shake hinzufügen, aber jetzt möchten Sie, dass der Prozess relativ extern zu den Computern ist, die ich einschalte.
Jon Phenow
1
Ich benutze -s auch, um ein kleineres Paket zu senden.
Shawn J. Goff
3
Ich bin schockiert, wenn das Senden eines kleineren Pakets einen Unterschied macht.
Mattdm
Werden sie nicht schon fast mit der Mindestgröße von Paketen gesendet?
Jon Phenow
4
Sie sind ziemlich klein; Es gibt einen Standardwert von 56 Datenbytes, den Sie reduzieren können. Aber in jedem Fall ist es kleiner als die Ethernet-MTU und größer als nichts, sodass es auf "ein Paket" ankommt.
Mattdm
7

Dafür wurde fping entwickelt. http://fping.sourceforge.net/

Sie müssen die Ausgabe anschließend analysieren, anstatt sich auf einen Rückkehrcode zu verlassen. Dies ist jedoch viel schneller als normales Ping.

Thorbjørn Ravn Andersen
quelle
Ich finde es irgendwie lustig, dass in der Beschreibung steht: "Im Gegensatz zu Ping soll Fping in Skripten verwendet werden und die Ausgabe ist einfach zu analysieren." und doch gibt es keinen Rückkehrcode
Adam Plocher
Was wären gute Werte für den Rückkehrcode?
Thorbjørn Ravn Andersen
3

Dies funktioniert nur für einen oder zwei Computer. Wenn Sie sie jedoch direkt mit dem Computer verbinden, der für die Statusprüfung zuständig ist, können Sie anhand ethtoolder Verknüpfung feststellen , ob die Verknüpfung aktiv ist oder nicht.

LawrenceC
quelle
Ich habe dafür kein Ethtool verwendet. Möchten Sie ein Beispiel geben? (oder vielleicht ein Link)?
Johan
ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'wird zurückgegeben, yeswenn eine Maschine angeschlossen ist, und nowenn dies nicht der Fall ist.
LawrenceC
2

Was Sie tun können, ist das Pingen der Broadcast-Adresse, wodurch alle Computer zurückpingen sollten. Dann können Sie diese Liste mit Ihrer SQLite-Version abgleichen, um sicherzustellen, dass alle Computer in Betrieb sind.

Abgesehen davon ist ein Ping wahrscheinlich der schnellste Weg, um sicherzustellen, dass ein Computer in einem Netzwerk aktiv ist. Wie in der anderen Antwort erwähnt, liefert dies keine wirklich nützlichen Daten. Wenn Sie Skripte installieren können, können Sie einen Cronjob zum Pingen eines zentralen Servers hinzufügen, eine Aufgabe ausführen oder die Prozessliste einfach an einen zentralen Server senden, der die Anforderung protokolliert. Prüfen Sie dann einfach, ob Probleme vorliegen, die nicht jedes Mal manuell überprüft werden müssen.

Josh K
quelle
1
Ich gehe davon aus, dass Sie die Broadcast-Adresse anpingen, nicht das Gateway. Auf modernen Systemen funktioniert das wahrscheinlich nicht. Siehe unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm
1
@mattdm: Multicast dann? Mir war nicht bewusst, dass die meisten Leute es ausgeschaltet haben. Ich hatte noch nie Probleme damit.
Josh K
Haha ja danke mattdm, ein ähnliches problem siehst du das ich getroffen habe. Es ist nicht so, dass die Leute sie ausschalten, aber sie kommen anscheinend in letzter Zeit mit einer Ausstrahlung.
Jon Phenow
Könnte fping ( fping.sourceforge.net ) verwenden, um eine Liste von Hosts parallel zu pingen . Dann müssen Sie sich nicht darauf verlassen, die Broadcast-Adresse pingen zu können.
Mazianni
2

Ganglia verwendet Multicast-Verkehr, um viele Hosts in einem Cluster zu überwachen. Vielleicht könnten Sie etwas Ähnliches verwenden? Dies setzt voraus, dass Ihre Netzwerkhardware Multicast-Verkehr zwischen allen Hosts und Ihrem Überwachungssystem zulässt.

jsbillings
quelle
1
Sieht aus wie ein cooles Tool, aber für die Zwecke dieses kleinen Skripts könnte das Projekt unnötig erweitert werden. Behalten Sie es vorerst als ziemlich kleines Skript bei. Ich werde es auf jeden Fall im Auge behalten, es sieht aus wie ein Werkzeug, das ich vielleicht bald benutzen werde.
Jon Phenow
0

Ich hatte das gleiche Problem und fand das folgende (schnelle & schmutzige) Skript. Dies gibt im Wesentlichen alle Pings als separate Jobs parallel aus und scannt ein gesamtes / 24-Subnetz in 3 Sekunden. Beachten Sie, dass ich aus irgendeinem Grund nicht herausfinden musste, dass ich den Ping-Ergebniscode hier nicht verwenden konnte, aber grep -v hat die Arbeit erledigt:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac
Peer
quelle
0

In C

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */
Joe
quelle
0

Ich habe fping -r0 ...die schnellste Antwort gefunden.

Die -r(Wiederholungs-) Option scheint schneller zu sein als die ähnliche -c(Anzahl). Bei Verwendung von -r0Ergebnissen wird nur ein Ping gesendet, und die Ausgabe wird im Vergleich zu anderen Optionen stark verkürzt.

Auf meinem System ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

Ergebnisse in ...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

Ein bisschen Massage, um die ICMPNachricht (en) loszuwerden, gibt mir ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

Was die Geschwindigkeit fpingangeht , ist der alte 1,8 GHz Intel Dual-Core mit 4 GB RAM ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

Und die grepund sortscheinen nur 0.001-0.004s zur Zeit hinzuzufügen ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

ANMERKUNGEN

  • Die ICMPMeldung tritt nicht bei jedem Lauf auf.
  • Das 2>&1ist notwendig , um zu verhindern ICMPNachricht aus zeigt sich in der Ausgabe , wie sie gesendet wird , stderrstatt stdout.
DocSalvager
quelle