Jak stworzyć pętlę w bashu, która czeka na odpowiedź serwera WWW?


105

Jak stworzyć pętlę w bashu, która czeka na odpowiedź serwera WWW?

Powinien wypisać "." mniej więcej co 10 sekund i poczekaj, aż serwer zacznie odpowiadać.

Zaktualizuj, ten kod sprawdza, czy otrzymuję dobrą odpowiedź z serwera.

jeśli curl --output / dev / null --silent --head --fail "$ url"; następnie
  echo „URL istnieje: $ url”
jeszcze
  echo "URL nie istnieje: $ url"
fi

Czy możesz podać bardziej szczegółowe informacje o oczekiwaniu na odpowiedź serwera?
chepner

Uważam, że serwer nie jest gotowy, o ile nie odpowiada lub odpowiada czymś innym niż odpowiedź 200.
sorin

Odpowiedzi:


173

Łącząc pytanie z odpowiedzią Chepnera, zadziałało to dla mnie:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done

10
Stosowanie znaków grawitacyjnych `` jest nieaktualne . Użyj $( )zamiast tego.
Serge Stroobandt

6
Byłoby świetnym przedłużeniem, pozwalającym na maksymalny czas oczekiwania przed poddaniem się
tkruse

Dlaczego potrzebujesz --head?
leksykor

3
@lexicore Ponieważ treść nie jest interesująca dla tego polecenia, prosimy tylko o głowę (chociaż możesz dołączyć logikę, aby sprawdzić więcej rzeczy o stanie serwera). Opuszczenie --headniczego nie zmieni, ale możesz to zrobić, jeśli chcesz poćwiczyć logikę w treści odpowiedzi (np. Status.html).
Thomas Ferris Nicolaisen,

1
Miałem konkretny przypadek, w którym używanie --headzawsze wracało 405. Musiałem go usunąć, żeby działał
Ron Harlev,

38

Chciałem ograniczyć maksymalną liczbę prób. Na podstawie zaakceptowanej odpowiedzi Thomasa zrobiłem to:

attempt_counter=0
max_attempts=5

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    if [ ${attempt_counter} -eq ${max_attempts} ];then
      echo "Max attempts reached"
      exit 1
    fi

    printf '.'
    attempt_counter=$(($attempt_counter+1))
    sleep 5
done

Proponuję dodać, --max-time 5jeśli z jakichś powodów żądany link
wygaśnie

16

httping jest do tego fajny. proste, czyste, ciche.

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done

podczas gdy / do itp. jest osobistym pref.


2
Po namyśle, wieczność to długi czas ... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge

2

Stosowanie znaków grawerowanych ` `jest przestarzałe . Użyj $( )zamiast tego:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
  printf '.'
  sleep 5
done

0

Ciekawa łamigłówka. Jeśli nie masz dostępu lub asynchronicznego interfejsu API ze swoim klientem, możesz spróbować grepować gniazda tcp w następujący sposób:

until grep '***IPV4 ADDRESS OF SERVER IN REVERSE HEX***' /proc/net/tcp
do
  printf '.'
  sleep 1
done

Ale to zajęte oczekiwanie z 1-sekundowymi odstępami. Prawdopodobnie potrzebujesz większej rozdzielczości. To również jest globalne. Jeśli zostanie nawiązane inne połączenie z tym serwerem, wyniki są nieprawidłowe.


-1

jeśli potrzebujesz sprawdzić, czy serwer jest dostępny, przyczyna się restartuje lub coś innego, możesz spróbować utworzyć wget na serwerze i przeanalizować odpowiedź lub błąd, jeśli otrzymasz 200 lub nawet 404, serwer działa, ty można zmienić limit czasu wget za pomocą --timeout = sekundy, można ustawić limit czasu na 10 sekund i zrobić pętlę, aż grep nad odpowiedzią przyniesie wynik.

nie wiem, czy to jest to, czego szukasz, czy naprawdę potrzebujesz kodu bash.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.