2014-12-22 60 views
27

我正在試圖用jenkins做一個自定義的dockerfile。我會等到8080端口打開,而不是用netcat做一個醜陋的「睡眠60」,但對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命令中減少連接超時,以便在Jenkins成功時獲得更快的響應。它是'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不只是bashcoreutils

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