我希望我的微服务在一个新的命令行中打开,并从那里一个接一个地运行它。下面是我的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命令对我来说不是一个选项。
答案 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地址。