Wyszukiwanie w witrynie

Jak powtarzać polecenie, aż zakończy się pomyślnie w systemie Linux


W tym krótkim przewodniku dowiemy się, jak powtarzać polecenie, aż zakończy się pomyślnie w systemie Linux. Może to być pomocne w wielu sytuacjach. Możesz na przykład użyć tej metody do sprawdzenia łączności sieciowej między dwoma lub większą liczbą hostów lub sprawdzenia połączenia z Internetem, aby sprawdzić, czy nadal jesteś w trybie online, czy offline. Niezależnie od przyczyny, jeśli kiedykolwiek chciałeś powtórzyć polecenie lub program w systemie Linux, aż zakończy się pomyślnie, ten przewodnik pomoże.

Powtarzaj polecenie, aż zakończy się pomyślnie w systemie Linux

Do powtarzalnego wykonywania listy poleceń używamy następujących konstrukcji pętli BASH:

  1. Podczas pętli,
  2. Aż do pętli.

While Loop wykonuje blok kodu (zawarty w do ... gotowe), gdy warunek jest prawda i wykonuje to dalej, aż warunek stanie się fałsz. Gdy warunek stanie się fałsz, pętla while zostanie zakończona.

Until Loop jest przeciwieństwem pętli While. Wykonuje blok kodu (zawarty w do ... gotowe), gdy warunek jest fałsz i wykonuje go, aż warunek stanie się falseprawda. Gdy warunek stanie się prawdą, pętla dopóki zostanie zakończona.

Najpierw przyjrzyjmy się, jak powtarzać polecenie lub program systemu Linux, aż do skutku, korzystając z pętli While.

1. Powtarzaj polecenia, używając pętli while

Spójrz na następujące polecenie:

while ! ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc

To polecenie będzie kontynuować próbę wysłania polecenia ping do witryny ostechnix.com. Gdy witryna przejdzie w tryb online, pętla While zakończy się i wyświetli program „xcalc”. Tutaj xcalc jest opcjonalne. Służy wyłącznie do celów powiadamiania. W przeciwnym razie może być konieczne sprawdzanie okna terminala, aby sprawdzić, czy polecenie się powiodło, czy nie.

Wyjaśnienie:

Rozłóżmy powyższe polecenie i zobaczmy, co robi każda instrukcja.

while ! ping -c 3 ostechnix.com ;

To jest zdanie warunkowe. Jak widać w tym stwierdzeniu, polecenie ping poprzedziliśmy znakiem !. Służy jako warunek „NIE”. Zatem rzeczywiste znaczenie powyższego wiersza jest takie: kiedy NIE można pingować ostechnix.com.

do sleep 2 ; done ;

Stwierdzenie „uśpij 2” wskazuje, że nie należy obciążać systemu wielokrotnym wykonywaniem polecenia ping co sekundę. Instruujemy system, aby poczekał chwilę, na przykład 2 sekundy, a następnie spróbował pingować ostechnix.com. Innymi słowy, polecenie Podczas będzie pingować witrynę co 2 sekundy. Gdy warunek stanie się fałszywy, pętla while zakończy się.

xcalc ;

Uruchom program xcalc. Ten program zostanie uruchomiony dopiero po pomyślnym wykonaniu poprzedniego polecenia.

Zatem zgodnie z powyższym poleceniem, jeśli warunek jest prawdziwy (tzn. jeśli witryna ostechnix.com jest „NIE” osiągalna), wykona blok kodu zawarty w do...done. Tutaj kod to „uśpienie 2”. Czeka więc 2 sekundy, a następnie próbuje ponownie pingować witrynę. Będzie to wykonywał, dopóki warunek nie stanie się fałszywy. Gdy warunek stanie się fałszywy (tzn. jeśli witryna ostechnix.com będzie osiągalna), pętla zakończy się i na koniec otworzy się program xcalc.

Oto przykładowe wyjście powyższego polecenia:

ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
PING ostechnix.com (104.26.5.40) 56(84) bytes of data.
64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=1 ttl=55 time=63.6 ms
64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=2 ttl=55 time=84.8 ms
64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=3 ttl=55 time=79.9 ms

--- ostechnix.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 63.602/76.114/84.810/9.068 ms
Warning: Cannot convert string "-adobe-symbol-*-*-*-*-*-120-*-*-*-*-*-*" to type FontStruct

2. Powtarzaj polecenia, używając pętli Until

Możesz to również zrobić za pomocą pętli „Until”, jak poniżej.

until ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc