2014-12-22 13 views
27

Sto provando a creare un file dock personalizzato con jenkins. Aspetterei che la porta 8080 sia aperta invece di fare un brutto "sleep 60" con netcat ma non molto sicuro di script di bash e netcat.Come aspettare una porta aperta con netcat?

Ecco un esempio di quello che sto cercando di fare:

#!/bin/bash 

opened=0 

while [ "$opened" == "0" ]; do 
    echo "Waiting jenkins to launch on 8080..." 
    nc -vz localhost 8080 
done 

echo "Jenkins launched" 

risposta

52

Non è possibile impostare netcat aspettare fino a qualche porta è aperta, quindi si deve aggiungere una parte per l'attesa prima del prossimo controllo è fatto. Prova questo:

#!/bin/bash 

echo "Waiting jenkins to launch on 8080..." 

while ! nc -z localhost 8080; do 
    sleep 0.1 # wait for 1/10 of the second before check again 
done 

echo "Jenkins launched" 
+5

finalmente ho usato uno script ricciolo di farlo: 'po '! curl --output/dev/null --silent --head --fail http: // localhost: 8080; fai dormire 1 && echo -n.; fatto; ' – FXG

+0

Come suggerimento, è anche possibile ridurre il timeout della connessione nel comando netcat per ottenere una risposta più rapida quando Jenkins si alza. È, 'nc -G 1 -z localhost 8000'. –

+1

nc: opzione non valida - 'z' – odiszapc

1

Ho trovato questo un problema abbastanza comune per scrivere un programma di utilità di aspettare per una porta da aprire, con un timeout facoltativo:

# without timeout 
wait-port localhost:8080 

# timeout after a minute 
wait-port -t 60000 localhost:8080 

E 'open source e disponibile presso github.com/dwmkerr/wait-port. Speriamo che gli altri lo trovino utile!

1

Come suggerito here, si potrebbe anche fare quanto segue se non si dispone di nc installato, ma solo bash e coreutils:

#!/bin/bash 

echo "Waiting jenkins to launch on 8080..." 

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/8080"; do 
    sleep 1 
done 

echo "Jenkins launched"