2015-06-24 147 views
6

我試圖從運行bash腳本命令:如何從bash執行mongo命令?

mongo 192.168.10.20:27000 --eval "use admin && db.shutdownServer() && quit()" 

,但我得到這個錯誤:

[rs.initiate() && use admin && db.shutdownServer() && quit()] doesn't exist 

我怎麼能做到這一點不使用js文件?

回答

13

還有differences between interactive & scripted mongo shell sessions。特別是,像use admin這樣的命令不是有效的JavaScript,只能在交互式shell會話中使用。

您的關機命令行的工作相當於是:

mongo 192.168.10.20:27000/admin --eval "db.shutdownServer()" 

您可以在連接字符串中使用數據庫,也沒有必要從腳本mongo shell會話退出。

如果您確實需要從腳本會話更改數據庫,則會有一個db.getSiblingDB() JavaScript函數。另一種編寫上述關機命令的方法是:

mongo 192.168.10.20:27000 --eval "db=db.getSiblingDB('admin');db.shutdownServer()" 
+1

,但你可以把更多的一個命令在EVAL? – MoienGK

+2

@MoienGK是的,你可以在'--eval'中加入更長的JavaScript。按照我的第二個示例,用分號分隔多個語句。 – Stennie

+0

意外的錯誤:「shutdownServer失敗:關機必須從本地主機運行db時沒有身份驗證」 – MoienGK

9

您可以使用heredoc語法。

#! /bin/sh 
mongo <<EOF 
use admin 
db.shutdownServer() 
quit() 
exit 

原來定界符拋出一個警告,當EOF在年底bash腳本失蹤。這是bash腳本版本。

#! /bin/bash 
mongo <<EOF 
use admin 
db.shutdownServer() 
quit() 
EOF 

這裏是輸出,我想這是你的預期。

MongoDB shell version: 2.4.14 
connecting to: test 
switched to db admin 
Wed Jun 24 17:07:23.808 DBClientCursor::init call() failed 
server should be down... 
Wed Jun 24 17:07:23.810 trying reconnect to 127.0.0.1:27017 
Wed Jun 24 17:07:23.810 reconnect 127.0.0.1:27017 ok 
Wed Jun 24 17:07:23.812 Socket recv() errno:104 Connection reset by peer 127.0.0.1:27017 
Wed Jun 24 17:07:23.812 SocketException: remote: 127.0.0.1:27017 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:27017] 
Wed Jun 24 17:07:23.812 DBClientCursor::init call() failed 
+0

是語法正確嗎? – MoienGK

+0

我更新了我的答案。 @MoienGK – Ugur

+0

這似乎是正確的。但我現在有其他無關緊要的問題:關閉時必須從本地主機運行數據庫時沒有auth.thanks回覆 – MoienGK

3

mongo docs

--eval option

Use the --eval option to mongo to pass the shell a JavaScript fragment, as in the following: mongo test --eval "printjson(db.getCollectionNames())"

你也可以把你的JS片段引入到.js文件然後執行:

mongo < myScript.js 

您也可以在此SO question

找到更多有用的東西