2012-08-10 7 views
52

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

Debe imprimir un "." cada 10 segundos más o menos, 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"; then 
    echo "URL exists: $url" 
else 
    echo "URL does not exist: $url" 
fi 
+0

¿Puede ser más específico sobre cómo espera que el servidor responda? – chepner

+0

Consideraré que el servidor no está listo, siempre que no responda o responda con algo diferente a una respuesta de 200. – sorin

Respuesta

85

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 
+5

El uso de backticks '' está [desactualizado] (http://unix.stackexchange.com/a/5782/39845). Use '$()' en su lugar. –

+2

Sería una gran extensión para permitir un tiempo de espera máximo antes de renunciar a – tkruse

+0

¿Por qué necesita un '--head'? – lexicore

-1

si necesita comprobar si el servidor está disponible, porque se está reiniciando o alguna otra cosa, usted podría tratar de hacer una wget para el servidor y analizar la respuesta o el error, si se obtiene un 200 o incluso una 404 el servidor está activo, puede cambiar el tiempo de espera del wget con --timeout = segundos, puede establecer el tiempo de espera en 10 segundos y hacer un ciclo 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.

0

Interesante rompecabezas. Si no tiene acceso o API asíncrona con su cliente, puede intentar grepping sus sockets TCP como esto:

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

Pero eso es una espera ocupado con intervalos de 1 seg. Probablemente quieras más resolución que eso. También esto es global. Si se realiza otra conexión a ese servidor, los resultados no son válidos.

0

El uso de acentos abiertos ` ` es outdated. Utilice $() lugar:

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

httping es agradable para esto. simple, limpio, tranquilo.

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

while/until etc es una preferencia personal.

+0

Pensándolo bien, siempre es un largo tiempo ... 'para mí en' seq 60'; do httping -qc1 http: // myhost: myport && echo && break sleep 5 echo -n $ {i} .. hecho ' –

0

wait-on es una utilidad de línea de comandos multiplataforma y API Node.js que esperar a que los archivos, puertos, tomas de corriente, y http (s) los recursos que estén disponibles: https://github.com/jeffbski/wait-on

Por ejemplo, esperar: 8080 5s y hacer NEXT_CMD si tiene éxito.

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