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 true
Befehl ausführen und dann die Verbindung schließen. Der ssh
Befehl 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 mysqld
auf 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 monit
auf 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/raid
das 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 telnet
jedoch 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 timeout
und 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