2012-08-10 12 views
52

Come creare un loop in bash che è in attesa di un webserver per rispondere?Come creare un loop in bash che è in attesa di un webserver per rispondere?

Dovrebbe stampare un "." ogni 10 secondi circa, e attendi fino a quando il server inizia a rispondere.

Aggiornamento, questo codice verifica se ottengo una buona risposta dal server.

 
if curl --output /dev/null --silent --head --fail "$url"; then 
    echo "URL exists: $url" 
else 
    echo "URL does not exist: $url" 
fi 
+0

Puoi essere più specifico su come stai aspettando che il server risponda? – chepner

+0

Considererò che il server non è pronto, a patto che non risponda o risponda a qualcosa di diverso da una risposta 200. – sorin

risposta

85

Combinando la domanda con la risposta di chepner, questo ha funzionato per me:

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

L'uso di backtick '' è [non aggiornato] (http://unix.stackexchange.com/a/5782/39845). Usa invece '$()'. –

+2

Sarebbe un'ottima estensione per consentire un tempo di attesa massimo prima di rinunciare allo – tkruse

+0

Perché è necessario un '--head'? – lexicore

-1

se avete bisogno di controllare se il server è disponibile, la causa sta riavviando o qualcosa d'altro, si potrebbe provare a fare un wget al server e analizzare la risposta o l'errore, se si ottiene un 200 o addirittura un 404 il server è attivo, è possibile modificare il timeout wget con --timeout = secondi, è possibile impostare il timeout su 10 secondi e creare un ciclo fino a quando il comando grep sulla risposta non ha un risultato.

Non so se questo è quello che stai cercando o davvero hai bisogno del codice bash.

0

Interessante puzzle. Se non si dispone di accesso o asincrono API con il vostro cliente, si può provare grepping tuoi socket TCP in questo modo:

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

ma questo è un'attesa occupato con intervalli di 1 sec. Probabilmente vuoi una risoluzione maggiore di quella. Anche questo è globale. Se viene effettuata un'altra connessione a quel server, i risultati non sono validi.

0

L'uso di backticks ` ` è outdated. Utilizzare invece:

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

httping è bello per questo. semplice, pulito, silenzioso.

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

while/until etc è un pref. Personale.

+0

Ripensandoci, per sempre è un tempo lungo ... 'per i in' seq 60'; do httping -qc1 http: // myhost: myport && echo && break sleep 5 echo -n $ {i} .. done ' –

0

wait-on è un'utility a riga di comando cross-platform e Node.js API che attendere che i file, le porte, prese, e le risorse per diventare disponibili http (s): https://github.com/jeffbski/wait-on

Per esempio, attendere: 8080 per 5s e fai NEXT_CMD se riesci.

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