java - bash 命令等待 TCP 端口打开

标签 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”。我可以通过检查服务是否正在监听网络端口来检测到这一点。有什么办法可以存档吗? sleep bash 命令不适合我。

最佳答案

基本上,您需要使用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

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

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

{
  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 地址。

关于java - bash 命令等待 TCP 端口打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44484346/

相关文章:

java - 在 TextView 中设置结果时出现空指针异常

java - 在java中读取2GB xml文件时出现OOM错误

c - 我的 C 代码如何在运行时(在 Linux 中)找到与地址对应的符号?

asp.net-mvc - asp.net 5 (vnext) build IConfiguration 丢失

sql-server - freebcp 因大量数据而停滞不前

java - 使用 Java 使用 Selenium WebDriver 捕获用户输入和操作

bash - 如何显示 bash session 的当前进程树?

linux - 创建一个较短版本的 bash 命令

bash - Ubuntu - curl X 次重复

java - 在java中实现类似的接口(interface)