Ars*_*nko 5 javascript bash mongodb
我有一个失败的bash脚本.检查后,似乎失败的原因是重启后立即访问MongoDB.
例如,运行:
mongo --eval "db.version()"
Run Code Online (Sandbox Code Playgroud)
给出预期的输出:
MongoDB shell版本:2.4.9
连接到:test
2.4.9
在跑步的时候:
service mongodb restart; mongo --eval "db.version()"
Run Code Online (Sandbox Code Playgroud)
产生以下输出,强调我的:
mongodb停止/等待
mongodb启动/运行,进程1466
MongoDB shell版本:2.4.9
连接到:test
Sat Oct 25 02:52:29.736 错误:无法连接到 src/mongo/shell /的服务器127.0.0.1:27017 mongo.js:145
例外:连接失败
因为服务器尚未就绪.
在执行bash脚本直到MongoDB实际准备好之前等待的正确方法是什么?
service mongodb status 不是解决方案,因为它报告服务的状态,而不是数据库本身.
nc -z localhost 27017重复执行直到其退出代码变为0将起作用,但我不确定是否没有缺点(以某种方式运行无限循环?)
要启动mongo解释器而不连接任何db:
mongo --nodb
Run Code Online (Sandbox Code Playgroud)
从那里,在mongo解释器内你可以执行:
var conn;
try
{
conn = new Mongo("localhost:27017");
}
catch(Error)
{
//print(Error);
}
while(conn===undefined)
{
try
{
conn = new Mongo("localhost:27017");
}
catch(Error)
{
//print(Error);
}
sleep(100);
}
DB = conn.getDB("test");
Result = DB.runCommand('buildInfo');
print(Result.version);
Run Code Online (Sandbox Code Playgroud)
使用上面的2,您可以将后面的部分放在Script.js之类的文件中,然后执行:
mongo --nodb Script.js
Run Code Online (Sandbox Code Playgroud)
编辑:那里,完全忘了你真正想要的是版本.修复了你的问题.
在@Magnitus的答案的基础上,我添加了超时和可配置的连接字符串。
var conn;
var interval = 100; // 100 Milliseconds polling
var timeout = 10000; // 10 Seconds timeout
var startTime = new Date();
connectionUrl = connectionUrl.split('/')[2];
if (connectionUrl.indexOf('@') !== -1) {
// Has auth (doesn't need auth for test connection)
connectionUrl = connectionUrl.split('@')[1];
}
while(conn === undefined) {
try {
var elapsed = (new Date() - startTime);
print("Attempting to connect to " + connectionUrl + " elapsed: " + elapsed + "ms");
conn = new Mongo(connectionUrl);
} catch(error) {
print(error);
if ((new Date() - startTime) >= timeout) {
print("ERROR: Failed to establish connection within timeout (" + timeout + "ms)");
quit(1);
} else {
sleep(interval);
}
}
}
print("MongoDB connection established in " + (new Date() - startTime) + "ms");
Run Code Online (Sandbox Code Playgroud)
您可以这样称呼它:
export MONGO_URL="mongo://<user>:<pass>@<host>:<port>/<database>"
mongo --nodb wait_for_mongo.js --eval "connectionUrl=\"$MONGO_URL\""
Run Code Online (Sandbox Code Playgroud)
该脚本仅需要host:port即可测试连接,因此MONGO_URL="mongo://localhost"足以测试连接。
| 归档时间: |
|
| 查看次数: |
3394 次 |
| 最近记录: |