2015-06-24 14 views
6

próbuję uruchomić to polecenie bash skryptu:Jak wykonać polecenie mongo z bash?

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

ale ja dostać ten błąd:

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

jak mogę to zrobić bez użycia pliku js?

Odpowiedz

13

Istnieją differences between interactive & scripted mongo shell sessions. W szczególności polecenia takie jak use admin nie są poprawne JavaScript i działają tylko w interaktywnej sesji powłoki.

Równowartość pracuje z linii poleceń zamykania systemu byłoby:

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

Możesz dołączyć bazę danych do wykorzystania w ciągu połączenia, i nie ma potrzeby, aby wyjść ze skryptem mongo sesji powłoki.

Jeśli zachodzi potrzeba zmiany baz danych z sesji skryptowej, dostępna jest funkcja JavaScript. Alternatywnym sposobem napisania powyższego polecenia zamknięcia jest:

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

, ale można umieścić więcej niż jedno polecenie w eval? – MoienGK

+2

@MoienGK Tak, możesz umieścić dłuższy kod JavaScript w '--eval'. Oddziel wiele instrukcji za pomocą średników, jak w moim drugim przykładzie. – Stennie

+0

nieoczekiwany błąd: "shutdownServer nie powiodło się: zamknięcie musi zostać uruchomione z localhost przy uruchomieniu db bez auth" – MoienGK

9

Można użyć składni heredoc.

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

Wyłącza składnię heredoc generuje ostrzeżenie, gdy brakuje EOF na końcu skryptu bash. To jest wersja skryptu bash.

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

Oto wyniki, myślę, że to jest to, czego się spodziewałeś.

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

Czy poprawna jest składnia? – MoienGK

+0

Zaktualizowałem moją odpowiedź. @MoienGK – Ugur

+0

wydaje się to poprawne. ale mam teraz inny problem nieistotny: shutdown musi być uruchamiany z localhost podczas uruchamiania db bez auth.thanks dla odpowiedzi – MoienGK

3

Z 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())"

Można również umieścić swoje JS Fragments do pliku .js wtedy zrobić:

mongo < myScript.js 

Możesz także znaleźć bardziej przydatne rzeczy w tym SO question

Powiązane problemy