我希望我的微服务在新的命令行中打开并从那里一个接一个地运行它。下面是我的 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/