如何使用netcat等待开放端口?

94

我想用自定义的dockerfile在jenkins中运行。我希望等待端口8080打开,而不是用netcat进行“sleep 60”等待。但是我对bash脚本和netcat并不很熟悉。

这是我尝试做的一个示例:

#!/bin/bash
 
opened=0
 
while [ "$opened"  == "0" ]; do
  echo "Waiting jenkins to launch on 8080..."
  nc -vz localhost 8080
done
 
echo "Jenkins launched"
14个回答

3
在上面的优秀回答基础上,如果这是经常使用的东西,使用工具可能是值得的。我经常为此使用uup
在您的示例中,要运行的命令如下:
uup localhost:8080 -r

提供输出如下: {{link1:输入图像描述}}

2

对于那些遇到“nc: invalid option -- 'z'”问题的人

我试图在一个docker镜像中设置它。令人惊讶的是,在该镜像中,nc没有-z选项。

镜像是 - Linux elasticsearch 4.4.0-101-generic #124~14.04.1-Ubuntu SMP Fri Nov 10 19:05:36 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

我使用以下循环来等待端口打开。

#!/bin/bash

echo "Waiting elastic search to launch on 9200..."

open=0;
while [ $open -eq 0 ]
do
    check_port=`nc -v -w 1 -i 1 127.0.0.1 9200 &> /dev/stdout`
    echo $check_port
    if [[ "$check_port" == *"Connected to"* ]]
    then
        break
    fi
    sleep 1
done

echo "Elastic Search launched"

以下是上述脚本的一行代码简述:
open=0;while [ $open -eq 0 ]; do check_port=`nc -v -w 1 -i 1 127.0.0.1 9200 &> /dev/stdout`; echo $check_port; if [[ "$check_port" == *"Connected to"* ]]; then   break; fi; sleep 1; done

1
如果你正在寻找一个Docker的一行命令,请查看我基于netcat循环的Docker镜像
$ docker run --rm igops/wait-for-port HOST PORT

E.g.,

$ docker run --rm igops/wait-for-port 172.17.0.1 80

每0.1秒查询172.17.0.1:80,并在连接建立时退出:

Waiting for 172.17.0.1:80...
OK

等待另一个容器响应:

$ docker network create my-bridge
$ docker run --rm -d --net my-bridge --net-alias my-mongo mongo
$ docker run --rm --net my-bridge igops/wait-for-port my-mongo 27017
$ echo "Mongo is up at this point, do some useful stuff here"

等待Docker主机上的某些服务:

$ docker run --rm --add-host="docker-host:host-gateway" igops/wait-for-port docker-host 22
$ echo "SSH server is running"

等待另一个发布了某个端口的容器:

$ docker run --rm -d -p 27017:27107 mongo
$ docker run --rm --add-host="docker-host:host-gateway" igops/wait-for-port docker-host 27017
$ echo "Mongo is up"

Read more


0
我使用这个示例用法
./xl_wait_port.sh [端口] [上 | 下]
参数: - 等待的端口 - 等待的状态,上或下
可以从github xl_wait_port 下载。我是作者。
代码片段
echo Waiting for port $PORT_NO to go $MODE.
LOOP_FLAG=1
WARN_FLAG=1
while [ "$LOOP_FLAG" -gt 0 ]; do
  LOOP_FLAG=1
  STATUS=`lsof -i :$PORT_NO`
  if [ "up" == $MODE ]; then
    if [ "1" -eq "$STATUS" ]; then
      LOOP_FLAG=0
    fi
  else
    if [ "0" = "$STATUS" ]; then
      LOOP_FLAG=0
    fi
  fi
  RESULT=$((WARN_FLAG % 35))
  if [ "$RESULT" -eq "0" ]; then
    echo "Process is taking some time. Please check or wait."
  fi
  sleep 1
  ((WARN_FLAG++))
done
echo Port $PORT_NO is now $MODE.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接