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
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
zamykaping
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 …?
/tmp
, jeśli host przestanie działać, ' ll kończy się wypełnieniem/tmp
. To zwykle zła wiadomość …