Comment créer une boucle dans bash qui attend qu’un serveur Web réponde?

Comment créer une boucle dans bash qui attend qu’un serveur Web réponde?

Il devrait imprimer un “.” toutes les 10 secondes environ et attendez que le serveur commence à répondre.

Mise à jour, ce code teste si je reçois une bonne réponse du serveur.

 if curl --output / dev / null --silent --head --fail "$ url";  puis
   echo "URL existe: $ url"
 autre
   echo "L'URL n'existe pas: $ url"
 Fi

En combinant la question avec la réponse de chepner, cela a fonctionné pour moi:

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

httping est bien pour cela. simple, propre, calme.

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

while / until etc est une préférence personnelle.

Je voulais limiter le nombre maximum de tentatives. Sur la base de la réponse acceptée de Thomas, j’ai fait ceci:

 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 

L’utilisation de backticks ` ` est obsolète . Utilisez plutôt $( ) :

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

wait-on est un utilitaire de ligne de commande multiplate-forme et l’API Node.js qui attend que les fichiers, les ports, les sockets et les ressources http (s) soient disponibles: https://github.com/jeffbski/wait-on

Par exemple, attendez: 8080 pour 5s et faites NEXT_CMD si vous réussissez.

 wait-on -t 5000 http-get://localhost:8080/foo && NEXT_CMD 

Puzzle intéressant. Si vous n’avez aucun access ou API asynchrone avec votre client, vous pouvez essayer de vider vos sockets TCP comme ceci:

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

Mais c’est une attente chargée avec des intervalles de 1 seconde. Vous voulez probablement plus de résolution que cela. C’est aussi global. Si une autre connexion est établie avec ce serveur, vos résultats ne sont pas valides.

Si vous avez besoin de vérifier si le serveur est disponible, s’il redémarre ou quelque chose d’autre, vous pouvez essayer de créer un wget sur le serveur et parsingr la réponse ou l’erreur, si vous obtenez un serveur 200 ou même 404, pourrait changer le timeout de wget avec –timeout = seconds, Vous pourriez définir le délai d’attente à 10 secondes et faire une boucle jusqu’à ce que le grep sur la réponse ait un résultat.

Je ne sais pas si c’est ce que vous recherchez ou si vous avez vraiment besoin du code bash.