2014-12-22 2 views
27

Я пытаюсь сделать пользовательский файл докеров с jenkins на нем. Я бы подождал, пока порт 8080 будет открыт, вместо того, чтобы делать уродливый «sleep 60» с netcat, но не очень уверен в сценариях bash и netcat.Как дождаться открытого порта с netcat?

Вот пример того, что я пытаюсь сделать:

#!/bin/bash 

opened=0 

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

echo "Jenkins launched" 

ответ

52

Вы не можете установить Netcat ждать, пока какой-то порт не открыт, так что вы должны добавить часть для ожидания до следующего чек сделал. Попробуйте это:

#!/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

, наконец, я использовал локон скрипт, чтобы сделать это: 'в то время! curl --output/dev/null --silent --head --fail http: // localhost: 8080; спать 1 && echo -n.; done; ' – FXG

+0

В качестве предложения вы также можете уменьшить время ожидания соединения в команде netcat, чтобы получить более быстрый ответ, когда Дженкинс встанет. Это «nc -G 1 -z localhost 8000'. –

+1

nc: неверный параметр - 'z' – odiszapc

1

Я нашел это общее достаточно проблем, чтобы написать программу, чтобы ждать, пока порт открыть, с дополнительным тайм-аут:

# without timeout 
wait-port localhost:8080 

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

Это открытый исходный код и доступны на github.com/dwmkerr/wait-port. Надеюсь, другие найдут это полезным!

1

Как предложил here, вы также можете сделать следующее, если у вас нет nc установлен, но bash и 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" 
Смежные вопросы