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
sorin
źródło
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
Thomas Ferris Nicolaisen
źródło
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
illagrenan
źródło
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.

Bruce Edge
źródło
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
Serge Stroobandt
źródło
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.

BoeroBoy
źródło
-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.

Krzepnąć
źródło