Plik skryptu Bash ping do sprawdzania dostępności hosta

Próbuję napisać skrypt bash w pliku, który po uruchomieniu zacznie pingować hosta, dopóki nie stanie się dostępny , kiedy host staje się osiągalny, uruchamia polecenie i przestaje je wykonywać, próbowałem je napisać, ale skrypt kontynuuje pingowanie do zakończenia liczenia,

Dodatkowo muszę umieścić ten proces w tle, ale jeśli uruchomię skrypt ze znakiem dolara ($), nadal działa na pierwszym planie,

#!/bin/bash ping -c30 -i3 192.168.137.163 if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 else echo “fail” fi 

Odpowiedź

Użyłbym prostego, jednowierszowego:

while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh 

Zastąp HOSTNAME z hostem, do którego próbujesz pingować.


Brakowało mi części dotyczącej umieszczania go w tle, umieść tę linię w skrypcie powłoki w następujący sposób:

#!/bin/sh while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" done echo "Host Found - `date`" /root/scripts/test1.sh 

A w tle uruchomiłbyś go w ten sposób:

nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 & 

Ponownie zamień HOSTNAME z hostem, do którego próbujesz wysłać polecenie ping. W tym podejściu przekazujesz nazwę hosta jako argument do skryptu powłoki.

Jako ogólne ostrzeżenie, jeśli twój host nie działa, skrypt będzie ciągle pingował w tle, dopóki go nie zabijesz lub host został znaleziony. Więc miałbym to na uwadze, kiedy to uruchomisz. Ponieważ możesz skończyć z jedzeniem zasobów systemowych, jeśli o tym zapomnisz.

Komentarze

  • Tnx za odpowiedź i ostrzeżenie, to jest wizualizowane środowisko więc skrypt uruchomi się po uruchomieniu serwerów fizycznych, więc maszyna wirtualna ' uruchomi się z pewnością, ale będzie pamiętać, jeśli usunę maszynę wirtualną, ponownie tnx
  • W szczególności rejestrując błędy za każdym razem i przechowując wszystkie dane wyjściowe w pliku w /tmp, jeśli host przestanie działać, ' ll kończy się wypełnieniem /tmp. To zwykle zła wiadomość …

Odpowiedź

Przekazując parametry „-c 30” do ping, spróbuje 30 pingów i zatrzyma się. Po wykonaniu polecenia sprawdzi, czy polecenie się powiodło. Myślę, że najlepiej jest zrobić pętlę zawierającą jeden ping i sprawdzić, czy ten ping się powiedzie. Coś takiego:

while true; do ping -c1 google.com if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 fi done 

Jeśli nadal działa na pierwszym planie, masz na myśli, że nadal drukuje na terminalu, możesz przekierować stdin i stdout do / dev / null.

Komentarze

  • Po odblokowaniu monitu, abym mógł zająć się czymś innym, tnx o pomoc

Odpowiedź

Stary post, ale jako sugestia możesz użyć opcji -w na polecenie ping do unikać pętli. Na przykład

ping -w 30 -c 1 host 

spróbuje przez 30 sekund z jednym pingiem na sekundę (domyślny ping ma 1-sekundową przerwę między pingami) i zakończy się po pierwszym udanym ping .

Jeśli nie potrzebujesz limitu czasu, to znaczy czekaj wiecznie, po prostu użyj bardzo dużej wartości z -w.

Odpowiedź

ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh 
  • ping -o zamyka ping po odebraniu pierwszego pakietu
  • > /dev/null przekierowuje wyjście, więc nie będziesz go widzieć
  • && uruchomi następne polecenie, jeśli poprzednie polecenie się powiedzie

Ponadto możesz uruchomić dowolny proces w tle, dodanie & na końcu; na przykład echo "123" & będzie działać w tle

Odpowiedź

Tutaj działa modyfikacja skryptu.

#!/bin/bash ping -c1 10.1.1.23 > /dev/null if [ $? -eq 0 ] then echo ok exit 0 else echo “fail” fi 

Musisz wysłać dane wyjściowe do /dev/null, aby nie pojawiły się na ekran.

-c jest przeznaczony do zliczania. Jeśli umieścisz -c30, będziesz „pingować 30 razy, zanim skrypt będzie mógł przejść do następnej linii. Używam -c1, aby skrypt działał szybciej.

-i to czekanie sekund między wysłaniem każdego pakietu. Tak więc -i3 ma czekać 3 sekundy. Usuwam -i, aby skrypt działał szybciej.

Wreszcie, użyj wcięcia, aby kod wyglądał ładnie i łatwiejszy do odczytania.

Przykładowe wyjście

user@linux:~$ ./script.sh ok user@linux:~$ user@linux:~$ ./script.sh “fail” user@linux:~$ 

Odpowiedź

#!/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 

Komentarze

  • Możesz też chcieć dodać kilka objaśniających słów …?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *