Ich versuche, ein Bash-Skript in eine Datei zu schreiben, die beim Ausführen einen Ping-Befehl an einen Host sendet, bis dieser verfügbar ist Wenn der Host erreichbar wird, führt er einen Befehl aus und hört auf, ihn auszuführen. Ich habe versucht, einen zu schreiben, aber das Skript pingt weiter, bis die Zählung endet.
Außerdem muss ich diesen Prozess in den Hintergrund stellen, aber wenn ich den ausführe Skript mit dem Dollarzeichen ($
), das noch im Vordergrund ausgeführt wird,
#!/bin/bash ping -c30 -i3 192.168.137.163 if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 else echo “fail” fi
Antwort
Ich würde diesen einfachen Einzeiler verwenden:
while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh
Ersetzen Sie HOSTNAME
mit dem Host, den Sie pingen möchten.
Ich habe den Teil über das Einfügen in den Hintergrund verpasst und diese Zeile in ein Shellscript wie folgt eingefügt:
#!/bin/sh while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" done echo "Host Found - `date`" /root/scripts/test1.sh
Und zum Hintergrund würden Sie es wie folgt ausführen:
nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 &
Ersetzen Sie HOSTNAME
mit dem Host, den Sie pingen möchten. Bei diesem Ansatz übergeben Sie den Hostnamen als Argument an das Shellscript.
Nur als allgemeine Warnung: Wenn Ihr Host nicht erreichbar ist, wird dieses Skript kontinuierlich im Hintergrund gepingt, bis Sie es entweder beenden oder Der Host wird gefunden. Ich würde das also berücksichtigen, wenn Sie dies ausführen. Da Sie möglicherweise Systemressourcen verbrauchen, wenn Sie dies vergessen.
Kommentare
- Tnx für die Antwort und die Warnung, ist dies eine visualisierte Umgebung Das Skript wird also nach dem Start der physischen Server gestartet, sodass die VM ' sicher gestartet wird. Beachten Sie jedoch, wenn ich eine VM lösche, tnx erneut
- Insbesondere indem Sie die Fehler jedes Mal protokollieren und die gesamte Ausgabe in einer Datei in
/tmp
speichern, wenn der Host ausfällt, ' ll Füllen Sie am Ende/tmp
. Das sind in der Regel schlechte Nachrichten …
Antwort
Übergeben Sie die Parameter „-c 30“ an Ping, es wird 30 Ping versuchen und aufhören. Danach wird geprüft, ob der Befehl erfolgreich ist. Ich denke, es ist am besten, eine Schleife zu erstellen, die einen Ping enthält, und zu überprüfen, ob dieser Ping erfolgreich ist. So etwas in der Art:
while true; do ping -c1 google.com if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 fi done
Wenn Sie immer noch im Vordergrund laufen, bedeutet dies, dass immer noch auf dem Terminal gedruckt wird, können Sie stdin und stdout nach / dev umleiten / null.
Kommentare
- Durch Entsperren der Eingabeaufforderung, damit ich an etwas anderem arbeiten kann, tnx um Hilfe
Antwort
Ein alter Beitrag, aber als Vorschlag können Sie die Option -w
beim Ping verwenden Vermeiden Sie die Schleife. Beispiel:
ping -w 30 -c 1 host
versucht 30 Sekunden lang mit einem Ping pro Sekunde (Standard-Ping hat ein Intervall von 1 Sekunde zwischen den Pings) und wird beim ersten erfolgreichen Ping beendet .
Wenn Sie keine Zeitüberschreitung benötigen, warten Sie einfach, verwenden Sie einfach einen sehr großen Wert mit -w
.
Antwort
ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh
-
ping -o
beendet dasping
nach dem Empfang des ersten Pakets -
> /dev/null
leitet die Ausgabe um, sodass Sie sie nicht sehen -
&&
würde den nächsten Befehl ausführen, wenn der vorherige Befehl erfolgreich wäre.
Außerdem können Sie jeden Prozess im Hintergrund von ausführen Hinzufügen von &
am Ende; Beispiel: echo "123" &
wird im Hintergrund ausgeführt.
Antwort
Hier funktioniert Änderung Ihres Skripts.
#!/bin/bash ping -c1 10.1.1.23 > /dev/null if [ $? -eq 0 ] then echo ok exit 0 else echo “fail” fi
Sie müssen die Ausgabe an /dev/null
senden, damit sie nicht angezeigt wird Der Bildschirm.
-c
ist für die Zählung vorgesehen. Wenn Sie -c30
eingeben, werden Sie mit Ping 30 fortfahren Mal, bevor Ihr Skript zur nächsten Zeile übergehen kann. Ich verwende -c1
, um das Skript schneller laufen zu lassen.
-i
wartet Sekunden zwischen dem Senden jedes Pakets. -i3
muss also 3 Sekunden warten. Ich entferne -i
, damit das Skript schneller ausgeführt wird.
Verwenden Sie zum Schluss Einrückungen, damit Ihr Code schön und leichter zu lesen ist.
Beispielausgabe
user@linux:~$ ./script.sh ok user@linux:~$ user@linux:~$ ./script.sh “fail” user@linux:~$
Antwort
#!/bin/sh if [ $1 ] then for i in ` cat $1` do VAR1=$(ping -ac 2 $i| grep -c error) if [ $VAR1 == "0" ] then echo " valid : $i" else echo " invalid : $i" fi done else echo " please present the file name. example: pong /tmp/a " fi
Kommentare
- Vielleicht möchten Sie auch um einige erklärende Wörter hinzuzufügen …?