Tue Dec 3 14:25:28.217 [initandlisten] waiting for connections on port 27017
这是我编写的bash脚本:
#!/bin/bash
# Initialize a mongo data folder and logfile
mkdir -p /data/db
touch /var/log/mongodb.log
# Start mongodb with logging
# --logpath Without this mongod will output all log information to the standard output.
# --logappend Ensure mongod appends new entries to the end of the logfile. We create it first so that the below tail always finds something
/usr/bin/mongod --quiet --logpath /var/log/mongodb.log --logappend &
# Wait until mongo logs that it's ready (or timeout after 60s)
COUNTER=0
grep -q 'waiting for connections on port' /var/log/mongodb.log
while [[ $? -ne 0 && $COUNTER -lt 60 ]] ; do
sleep 2
let COUNTER+=2
echo "Waiting for mongo to initialize... ($COUNTER seconds so far)"
grep -q 'waiting for connections on port' /var/log/mongodb.log
done
# Now we know mongo is ready and can continue with other commands
...
#!/bin/bash
# Wait until Mongo is ready to accept connections, exit if this does not happen within 30 seconds
COUNTER=0
until mongo --host ${MONGO_HOST} --eval "printjson(db.serverStatus())"
do
sleep 1
COUNTER=$((COUNTER+1))
if [[ ${COUNTER} -eq 30 ]]; then
echo "MongoDB did not initialize within 30 seconds, exiting"
exit 2
fi
echo "Waiting for MongoDB to initialize... ${COUNTER}/30"
done
# Connect to the MongoDB and execute the create users script
mongo ${FWRD_API_DB} /root/create-user.js --host ${MONGO_HOST} -u ${MONGO_ROOT_USER} -p ${MONGO_ROOT_PASSWORD} --authenticationDatabase admin
# Wait until mongo logs that it's ready (or timeout after 60s)
COUNTER=0
while !(nc -z localhost 27017) && [[ $COUNTER -lt 60 ]] ; do
sleep 2
let COUNTER+=2
echo "Waiting for mongo to initialize... ($COUNTER seconds so far)"
done
7条答案
按热度按时间wztqucjr1#
像你建议的那样在循环中测试连接,
tzxcd3kk2#
一个使用MongoDB工具的解决方案。在Docker容器或类似的不想安装
nc
的地方很有用。基于另一个人的回答。
2uluyalo3#
我最近也遇到了同样的问题,我决定配置 mongod 将所有输出记录到一个日志文件中,然后循环检查日志文件,直到看到提示mongod准备就绪的输出。
这是我们需要等待的日志文件输出行示例:
这是我编写的bash脚本:
请注意,脚本不会永远等待,它会在60秒后超时-您可能希望也可能不希望这样,这取决于您的用例。
jdzmm42g4#
我需要Mongo在Docker中运行,以便在创建用户之前进行初始化。我结合了Tom和Björn的答案。这是我正在使用的脚本:
kg7wmglp5#
虽然Tom的答案在大多数情况下都能很好地工作,但如果您运行带有
-e
标志的脚本,它可能会失败。我的意思是,您运行的脚本顶部带有set -e
。为什么?因为Tom的答案依赖于前一个命令的退出状态,在本例中,grep -q
如果找不到所需的字符串,则会失败。因此整个脚本将失败。-e
标记文档提供了如何避免此问题的线索:如果失败的命令是紧跟在while或until关键字之后的命令列表的一部分、if语句中的测试的一部分、在&&或||列表,但最后的&&或后面的命令除外||、管道中除最后一个命令之外的任何命令,或者命令的返回状态正被!反转。
因此,一个解决方案是将grep命令作为while条件的一部分。然而,由于他使用
--logappend
选项运行mongodb,搜索字符串可能会作为上一次运行的结果出现。我将其他人的答案与Tom的答案结合起来,效果非常好:我发现使用Tomcat是最好的解决方案,因为它实际上测试是否有东西在侦听。
roqulrg36#
可能的Docker解决方案:
给定
docker_id
对我来说,它的工作原理是阅读docker logs
如下:然后继续任何蒙戈依赖的任务。
o2gm4chl7#
这种方法在bitnami mongodb helm chart中使用,但需要安装mongodb shell客户端: