Wie erstelle ich eine Schleife in Bash, die darauf wartet, dass ein Webserver antwortet?

100

Wie erstelle ich eine Schleife in Bash, die darauf wartet, dass ein Webserver antwortet?

Es sollte ein "." Warten Sie etwa alle 10 Sekunden, bis der Server zu antworten beginnt.

Update, dieser Code testet, ob ich eine gute Antwort vom Server bekomme.

if curl --output / dev / null --silent --head --fail "$ url"; dann
  echo "URL existiert: $ url"
sonst
  echo "URL existiert nicht: $ url"
fi
Sorin
quelle
Können Sie genauer sagen, wie Sie auf die Antwort des Servers warten?
Chepper
Ich werde berücksichtigen, dass der Server nicht bereit ist, solange er nicht antwortet oder mit etwas anderem als einer 200-Antwort antwortet.
Sorin

Antworten:

167

Die Frage mit der Antwort von chepner zu kombinieren, funktionierte für mich:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done
Thomas Ferris Nicolaisen
quelle
10
Die Verwendung von Backticks `` ist veraltet . Verwenden Sie $( )stattdessen.
Serge Stroobandt
6
Wäre eine großartige Erweiterung, um eine maximale Wartezeit vor dem Aufgeben zu ermöglichen
tkruse
Warum brauchst du eine --head?
Lexicore
3
@lexicore Da der Body für diesen Befehl nicht interessant ist, fordern wir nur den Kopf an (obwohl Sie Logik einschließen könnten, um mehr Informationen über den Status des Servers zu erhalten). Das Auslassen --headwürde nichts ändern, aber Sie könnten es, wenn Sie eine Logik für den Antwortinhalt anwenden möchten (wie eine status.html).
Thomas Ferris Nicolaisen
1
Ich hatte einen speziellen Fall, in dem die Verwendung --headimmer zurückgegeben wurde 405. Musste es entfernen, damit es funktioniert
Ron Harlev
38

Ich wollte die maximale Anzahl von Versuchen begrenzen. Basierend auf Thomas 'akzeptierter Antwort habe ich Folgendes gemacht:

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
quelle
Ich schlage vor, hinzuzufügen, --max-time 5wenn aus bestimmten Gründen Link-Zeiten
abgelaufen sind
16

httping ist schön dafür. einfach, sauber, ruhig.

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

während / bis etc ist eine persönliche Präferenz.

Bruce Edge
quelle
2
Auf den zweiten Blick ist für immer eine lange Zeit ... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge
2

Die Verwendung von Backticks ` `ist veraltet . Verwenden Sie $( )stattdessen:

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

Interessantes Rätsel. Wenn Sie mit Ihrem Client keinen Zugriff oder keine asynchrone API haben, können Sie versuchen, Ihre TCP-Sockets wie folgt zu durchsuchen:

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

Aber das ist eine anstrengende Wartezeit mit Intervallen von 1 Sekunde. Sie möchten wahrscheinlich mehr Auflösung als das. Auch das ist global. Wenn eine andere Verbindung zu diesem Server hergestellt wird, sind Ihre Ergebnisse ungültig.

BoeroBoy
quelle
-1

Wenn Sie überprüfen müssen, ob der Server verfügbar ist, die Ursache neu gestartet wird oder etwas anderes, können Sie versuchen, ein Wget zum Server zu erstellen und die Antwort oder den Fehler zu analysieren. Wenn Sie eine 200 oder sogar eine 404 erhalten, ist der Server aktiv könnte das wget-Timeout mit --timeout = Sekunden ändern. Sie könnten das Timeout auf 10 Sekunden setzen und eine Schleife erstellen, bis der Grep über der Antwort ein Ergebnis hat.

Ich weiß nicht, ob dies das ist, wonach Sie suchen oder ob Sie wirklich den Bash-Code benötigen.

Gerinnen
quelle