我正在尝试等待我的docker容器启动一些命令。
我正在做以下事情:
#!/bin/bash
DOCKER_IP=192.168.99.100
ES_PORT=9300
docker-compose up -d
while [ -z "$(nc -z $DOCKER_IP $ES_PORT)" ]; do
sleep 1
done
echo "Do some stuff now it's up !"
我已经与cat -e
核实,nc -z
的返回为空,没有引号,[ ! -n $(nc ...)]
为条件表达式...
当nc
的返回值不为空时,我在循环中有Connection to 192.168.99.100 port 9300 [tcp/vrace] succeeded!
并且它永远不会退出。
为什么这个简单的循环条件不起作用?
答案 0 :(得分:1)
问题很可能是因为nc
在标准错误上打印消息“Connection to 192.168.99.100 port 9300 [tcp/vrace] succeeded!
”而不是标准输出(否则你不应该看到它)。您可以重定向标准错误(以便命令替换捕获它),如下所示:
while [ -z "$(nc -z $DOCKER_IP $ES_PORT 2>&1)" ]; do
sleep 1
done
但是,并非所有版本的nc
在连接成功时都打印此消息(我的不是)。那你为什么不简单地使用nc -z
的退出状态:
while ! nc -z $DOCKER_IP $ES_PORT
do
sleep 1
done