bash命令等待TCP端口打开

时间:2017-06-11 13:24:50

标签: java linux bash microservices

我希望我的微服务在一个新的命令行中打开,并从那里一个接一个地运行它。下面是我的bash脚本

################ first SERVER #####################
gnome-terminal -x sh -c 'java -jar server/target/first-server.jar; exec bash'

################ second SERVER #####################
export service_port=8771
export host_name=firstdomain
gnome-terminal -x sh -c 'java -Dservice.port="${service_port}" -Dhost.name="${host_name}" -jar eureka/target/second-server.jar; exec bash'

问题是我想在成功启动“first-server.jar”后启动“second-server.jar”。我可以通过检查服务是否正在侦听网络端口来检测到。有没有办法存档? 睡眠 bash命令对我来说不是一个选项。

1 个答案:

答案 0 :(得分:2)

基本上,您需要使用sleep命令。但是如果端口可用,您可以在循环检查中使用它。但是如何检查端口的可用性?

一种选择是使用Jack建议的netstat命令。正确的用法是:

netstat -tna | grep 'LISTEN\>' | grep ':NNNN\>'

其中NNNN是端口。要使该条件等待,您可以编写以下循环:

while ! netstat -tna | grep 'LISTEN\>' | grep -q ':NNNN\>'; do
  sleep 10 # time in seconds, tune it as needed
done

请注意-q的最后一个实例中的grep选项。

另一个选项是检查是否可以连接到端口:

{
  while ! echo -n > /dev/tcp/localhost/NNNN; do
    sleep 10
  done
} 2>/dev/null

根据您使用的分发以及编译选项bash,此方法可能有效,也可能无效。

检查端口是否可访问的另一个选项是使用nc:

while ! nc -q0 localhost 2222 < /dev/null > /dev/null 2>&1; do
  sleep 10
done

您可以将localhost替换为您的主机名或IP地址。