2014-12-22 102 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"