Shell-Befehl / Skript, um zu sehen, ob ein Host lebt?

9

Ich versuche, mithilfe von Shell-Befehlen (hauptsächlich Bash) herauszufinden, wie ein bestimmter Host aktiv ist. Im Idealfall kann es sowohl mit Hostnamen als auch mit IP-Adressen arbeiten. Im Moment ist der einzige native Weg, den ich kenne, Ping, vielleicht in ein Skript integriert, wie hier beschrieben. Irgendwelche anderen Ideen?

user67459
quelle

Antworten:

7

ping Auf diese Weise können Sie testen, ob ein Host aktiv und verbunden ist. (Wenn ein Host lebt, aber nicht verbunden ist oder nur langsam reagiert, können Sie dies nicht von seinem Tod unterscheiden.)

Die vom pingBefehl unterstützten Optionen variieren von System zu System. Sie sollten sicherstellen, dass es nicht für immer wiederholt wird, sondern nach einigen Sekunden zurückkehrt, wenn es keine Antwort erhalten hat.

Sendet mit FreeBSD- und Linux-iputils ping -c 1 -W 1 >/dev/nulleinen einzelnen Ping und wartet 1 Sekunde. Sie müssen die Ausgabe nicht analysieren: Der Befehl gibt 0 zurück, wenn er einen Pingback erhalten hat, andernfalls ungleich Null (unbekannter Hostname, keine Route zum Host, keine Antwort). Einige Implementierungen benötigen möglicherweise andere Flags (z. B. -wanstelle von -WFreeBSD). Lesen Sie das Handbuch auf Ihrem System.

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
  echo "$hostname_or_ip_address is alive"
else
  echo "$hostname_or_ip_address is pining for the fjords"
fi
Gilles 'SO - hör auf böse zu sein'
quelle
Ich weiß, es ist der Weg, ich hatte nur gehofft, dass es nicht der einzige Weg ist, auch wenn die anderen Wege seltsam oder launisch sind oder was hast du? Naja!
user67459
2
Diese Antwort sollte NICHT als answeredAntwort markiert worden sein . Das OP hat ausdrücklich darum gebeten more ways to see if a given host is up, außer mit ping, was diese Antwort nicht liefert.
Yokai
Von der ' "Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
Ping'-
@ 1111161171159459134 Dieser Absatz hätte besser formuliert werden können. Es ist übermäßig alarmierend. Sie sollten keine Flood-Pings oder Pings mit einer sehr hohen Rate durchführen, aber ein Ping-Paket ist ab und zu vernachlässigbar.
Gilles 'SO - hör auf böse zu sein'
2

Ping ist großartig, um schnell eine Antwort zu erhalten, ob der Host mit dem Netzwerk verbunden ist, aber es sagt Ihnen oft nicht, ob der Host lebt oder nicht oder ob er noch wie erwartet funktioniert. Dies liegt daran, dass Ping-Antworten normalerweise vom Kernel verarbeitet werden. Selbst wenn jede Anwendung auf dem System abgestürzt ist (z. B. aufgrund eines Festplattenfehlers oder eines Speichermangels), erhalten Sie häufig weiterhin Ping-Antworten und gehen möglicherweise davon aus, dass dies der Computer ist Normaler Betrieb, wenn die Situation genau umgekehrt ist.

Überprüfung der Dienste

Normalerweise ist es Ihnen egal, ob ein Host noch online ist oder nicht. Was Sie wirklich interessiert, ist, ob der Computer noch eine Aufgabe ausführt. Wenn Sie die Aufgabe also direkt überprüfen können, wissen Sie, dass sowohl der Host aktiv ist als auch die Aufgabe noch ausgeführt wird.

Für einen Remote-Host, auf dem beispielsweise ein Webserver ausgeführt wird, können Sie Folgendes tun:

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
  echo "$TARGET alive and web site is up"
else
  echo "$TARGET offline or web server problem"
fi

Wenn SSH ausgeführt wird und Sie Schlüssel für die kennwortlose Anmeldung eingerichtet haben, haben Sie einige weitere Optionen, zum Beispiel:

if ssh "$TARGET" true; then
  echo "$TARGET alive and accessible via SSH"
else
  echo "$TARGET offline or not accepting SSH logins"
fi

Dies funktioniert, indem Sie SSH in den Host einbinden, den trueBefehl ausführen und dann die Verbindung schließen. Der sshBefehl gibt nur dann Erfolg zurück, wenn dieser Befehl erfolgreich ausgeführt werden konnte.

Remote-Tests über SSH

Sie können dies erweitern, um nach bestimmten Prozessen zu suchen, z. B. um sicherzustellen, dass diese mysqldauf dem Computer ausgeführt werden:

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
  echo "$TARGET alive and running MySQL"
else
  echo "$TARGET offline or MySQL crashed"
fi

In diesem Fall ist es natürlich besser, etwas wie monitauf dem Ziel auszuführen, um sicherzustellen, dass der Dienst weiterhin ausgeführt wird. Dies ist jedoch in Skripten nützlich, in denen Sie nur eine Aufgabe auf Maschine A ausführen möchten, solange Maschine B dafür bereit ist .

Dies kann so etwas wie die Überprüfung sein, ob auf dem Zielcomputer ein bestimmtes Dateisystem bereitgestellt ist, bevor ein Vorgang ausgeführt wird rsync, damit Sie die Hauptfestplatte nicht versehentlich füllen, wenn ein sekundäres Dateisystem aus irgendeinem Grund nicht bereitgestellt wurde. Dadurch wird beispielsweise sichergestellt, dass /mnt/raiddas Gerät auf dem Zielcomputer bereitgestellt ist, bevor Sie fortfahren.

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
  echo "$TARGET alive and filesystem ready to receive data"
else
  echo "$TARGET offline or filesystem not mounted"
fi

Dienstleistungen ohne Client

Manchmal gibt es keine einfache Möglichkeit, eine Verbindung zum Dienst herzustellen, und Sie möchten nur sehen, ob eingehende TCP-Verbindungen akzeptiert werden. Wenn Sie telnetjedoch zum Ziel auf dem betreffenden Port gelangen, befindet es sich nur dort und trennt Sie nicht, was bedeutet, dass Sie dies tun in einem Skript würde es hängen lassen.

Obwohl es nicht ganz so sauber ist, können Sie dies dennoch mit Hilfe der Programme timeoutund tun netcat. Auf diese Weise wird beispielsweise überprüft, ob der Computer SMB / CIFS-Verbindungen am TCP-Port 445 akzeptiert, sodass Sie sehen können, ob die Windows-Dateifreigabe ausgeführt wird, auch wenn Sie kein Kennwort zum Anmelden haben oder die CIFS-Client-Tools nicht vorhanden sind. t installiert:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
  echo "$TARGET alive and CIFS service available"
else
  echo "$TARGET offline or CIFS unavailable"
fi
Malvineous
quelle