¿Cómo crear un bucle en bash que está esperando que responda un servidor web?

104

¿Cómo crear un bucle en bash que está esperando que responda un servidor web?

Debería imprimir un "." aproximadamente cada 10 segundos y espere hasta que el servidor comience a responder.

Actualización, este código prueba si obtengo una buena respuesta del servidor.

if curl --output / dev / null --silent --head --fail "$ url"; luego
  echo "La URL existe: $ url"
más
  echo "URL no existe: $ url"
fi
sorin
fuente
¿Puede ser más específico sobre cómo está esperando que responda el servidor?
chepner
Consideraré que el servidor no está listo, siempre que no responda o responda con algo diferente a una respuesta 200.
sorin

Respuestas:

170

Combinando la pregunta con la respuesta de Chepner, esto funcionó para mí:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done
Thomas Ferris Nicolaisen
fuente
10
El uso de comillas invertidas `` está desactualizado . Úselo en su $( )lugar.
Serge Stroobandt
6
Sería una gran extensión para permitir un tiempo máximo de espera antes de rendirse
tkruse
¿Por qué necesitas un --head?
lexicore
3
@lexicore Dado que el cuerpo no es interesante para este comando, solo solicitamos el encabezado (aunque podría incluir lógica para verificar más cosas sobre el estado del servidor). Dejar fuera --headno cambiaría nada, pero podría hacerlo si desea ejercitar algo de lógica en el contenido de la respuesta (como un status.html).
Thomas Ferris Nicolaisen
1
Tuve un caso específico en el que el uso --headsiempre regresaba 405. Tuve que quitarlo para que funcionara
Ron Harlev
38

Quería limitar el número máximo de intentos. Basado en la respuesta aceptada de Thomas, hice esto:

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
fuente
Sugiero agregar --max-time 5si por alguna razón se agota el tiempo de espera del enlace solicitado
Enigo
16

httping es bueno para esto. sencillo, limpio, tranquilo.

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

while / until etc es una preferencia personal.

Bruce Edge
fuente
2
Pensándolo bien, para siempre es mucho tiempo ... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge
2

El uso de comillas invertidas ` `está desactualizado . Utilice en su $( )lugar:

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

Interesante rompecabezas. Si no tiene acceso o api asincrónica con su cliente, puede intentar grepping sus sockets tcp de esta manera:

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

Pero esa es una espera ocupada con intervalos de 1 segundo. Probablemente quieras más resolución que esa. También esto es global. Si se establece otra conexión con ese servidor, sus resultados no son válidos.

BoeroBoy
fuente
-1

Si necesita verificar si el servidor está disponible, la causa se está reiniciando o algo más, puede intentar hacer un wget al servidor y analizar la respuesta o el error, si obtiene un 200 o incluso un 404, el servidor está activo, usted podría cambiar el tiempo de espera de wget con --timeout = segundos, podría establecer el tiempo de espera en 10 segundos y hacer un bucle hasta que el grep sobre la respuesta tenga un resultado.

No sé si esto es lo que está buscando o realmente necesita el código bash.

Coágulo
fuente