So stoppen Sie Mongo DB in einem Befehl

159

Ich muss in der Lage sein, MongoDB auf dem CLI zu starten / stoppen. Es ist ganz einfach zu beginnen:

./mongod

Aber um Mongo DB zu stoppen, muss ich zuerst Open Mongo Shell ausführen und dann zwei Befehle eingeben:

$ ./mongo

benutze admin

db.shutdownServer ()

Ich weiß also nicht, wie ich Mongo DB in einer Zeile stoppen soll. Irgendeine Hilfe?

XiaoYao
quelle

Antworten:

226

Das Starten und Stoppen von MongoDB wird im MongoDB-Handbuch behandelt. Es werden die verschiedenen Optionen zum Stoppen von MongoDB über die Shell, CLI, Treiber usw. erläutert. Außerdem werden die Risiken eines falschen Stopps von MongoDB (z. B. Datenkorruption) beschrieben und die verschiedenen Kill-Signale erläutert.

Wenn Sie MongoDB mit einem Paketmanager für Ubuntu oder Debian installiert haben , können Sie mongodb (derzeit mongod in ubuntu) wie folgt stoppen:

  • Emporkömmling: sudo service mongod stop

  • Sysvinit: sudo /etc/init.d/mongod stop

Oder unter Mac OS X.

Oder auf Red Hat- basierten Systemen:

  • service mongod stop

Oder unter Windows, wenn Sie einen Dienst mit dem Namen installiert haben MongoDB:

  • net stop MongoDB

Und wenn Sie nicht als Dienst installiert sind (ab Windows 7+), können Sie Folgendes ausführen:

  • taskkill /f /im mongod.exe

Weitere Informationen zu den Problemen eines unreinen Herunterfahrens, zur Vermeidung eines solchen Szenarios und zur Vorgehensweise bei einem unreinen Herunterfahren finden Sie unter: Wiederherstellen von Daten nach einem unerwarteten Herunterfahren .

Mark Hillick
quelle
5
Ich glaube, die Bestellung für Service ist sudo service mongodb [start|stop|restart|status]. sudo service stop mongodbErgebnisse in: Stop: nicht erkannter Dienst
Jacob
2
@ Jacob - Wir haben es gerade auf Ubuntu versucht, du hast Recht, ich habe die Antwort bearbeitet.
Andrew M
5
Für Mac können Sie auch einfach "Killall Mongod" ausführen. Auf diese Weise müssen Sie die PID nicht kennen.
Jon M
2
Oder auf dem Mac: 'ps -ax | grep mongod ', dann töte die Prozessnummer
Bryan Grace
1
In der neuen Ubuntu 18.04 kann ich es mit> sudo service mongod stop stoppen ... nicht "mongodb"
Naseef Ummer
101

Wenn Sie buchstäblich eine Zeile wünschen, die den Befehlen in Ihrer ursprünglichen Frage entspricht, können Sie einen Alias ​​verwenden:

mongo --eval "db.getSiblingDB('admin').shutdownServer()"

Marks Antwort zum Starten und Stoppen von MongoDB über Dienste ist der typischere (und empfohlene) Verwaltungsansatz.

Stennie
quelle
3
Gute Antwort. Wenn mehrere Instanzen auf Entwicklungsmaschine (versuchen , den Replikation Satz vor der Bereitstellung) Einrichten hilft es , eine .bat zu haben , start C:\mongodb\bin\mongod.exe --config C:\net2\primary1-pc\mongod.cfg start C:\mongodb\bin\mongod.exe --config C:\net2\secondary1-pc\mongod.cfg ... und dann hat shutdown.bat C:\mongodb\bin\mongo.exe --eval "db.getSiblingDB('admin').shutdownServer()" --port 27017 C:\mongodb\bin\mongo.exe --eval "db.getSiblingDB('admin').shutdownServer()" --port 27018 C:\mongodb\bin\mongo.exe --eval "db.getSiblingDB('admin').shutdownServer()" --port 27019 ...
Entwickler Marius Žilėnas
2
Unter Windows, wo es als Dienst installiert ist, stellte ich fest, dass dies net stop MongoDBnicht zuverlässig war, und verwendete daher etwas Ähnliches : mongo admin --eval "db.shutdownServer()". Prost!
NateJ
1
@Stennie Wenn ich die 'Net Stop MongoDB' unter Windows verwende, wird "Systemfehler 1067 ist aufgetreten"
angezeigt
48

mongod --dbpath /path/to/your/db --shutdown

Weitere Informationen unter offiziell: http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/

francoisrv
quelle
Ich liebe es, diese Methode zu verwenden. Sie funktioniert auch ohne Datenbankpfad. Dies ist sinnvoll, wenn nur eine Instanz ausgeführt wird.
Radtek
2
Es scheint, dass es für neuere Versionen von 2.4.xx bis zur neuesten Version nicht funktioniert.
Alexander Server
Dies ist die einzige Antwort, die ich gesehen habe und die tatsächlich funktioniert hat.
David Betz
6
macOS 10.12, mongod v3.4.10: Error parsing command line: unrecognised option '--shutdown':-(
t0r0X
Gibt es dafür ein definiertes Verhalten, wenn es auf einer Primärdatenbank eines Replikatsatzes ausgeführt wird? Es scheint sich so zu verhalten, als db.shutdownServer({force:1,timeoutSecs:0})würde es das Löschen der verbleibenden Daten auf die Sekundärdaten verhindern. Das möchten Sie vielleicht nicht immer.
Daniel F
30

Wenn der Server als Vordergrundprozess in einem Terminal ausgeführt wird, kann dies durch Drücken von erfolgen

Ctrl-C

Eine andere Möglichkeit, einen laufenden Server sauber herunterzufahren, ist die Verwendung des Befehls shutdown.

> use admin
> db.shutdownServer();

Andernfalls kann ein Befehl wie kill verwendet werden, um das Signal zu senden. Wenn Mongod 10014 als PID hat, wäre der Befehl

kill -2 10014
Nanhe Kumar
quelle
3
Die Verwendung von kill ist keine gute Idee. Dies kann zu einer defekten Datenbank führen, die zum Neustart repariert werden muss. "Verwenden Sie niemals kill -9 (dh SIGKILL), um eine Mongod-Instanz zu beenden." Docs: docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…
Jens A. Koch
7
@ JensA.Koch Ya, Nanhe hat niemandem gesagt, er solle ein -9-Signal verwenden, also ist es einfach nicht richtig zu sagen, "Kill zu verwenden ist keine gute Idee". Nur eine sofortige Kündigung ist unsicher - ein normaler Kill ist absolut sicher und die Dokumentation, mit der Sie verlinkt haben, spricht dafür.
BT
18

Ich folgte der offiziellen MongoDB-Dokumentation, um mit Signalen anzuhalten. Einer der folgenden Befehle kann verwendet werden (PID steht Process IDfür den mongodProzess):

kill PID

welches das Signal 15 (SIGTERM) sendet, oder

kill -2 PID

welches Signal 2 (SIGINT) sendet.

Warnung aus der MongoDB-Dokumentation :
Verwenden Sie niemals kill -9(dh SIGKILL), um eine mongodInstanz zu beenden .

Wenn mehr als eine Instanz ausgeführt wird oder Sie sich nicht für die PID interessieren, können Sie pkilldas Signal an alle ausgeführten mongodProzesse senden :

pkill mongod

oder

pkill -2 mongod

oder viel sicherer nur für die Prozesse, die Ihnen gehören:

pkill -U $USER mongod

oder

pkill -2 -U $USER mongod

PS
Hinweis: Ich habe auf diese Option zurückgegriffen, da sie mongod --shutdown, obwohl in der aktuellen MongoDB-Dokumentation erwähnt , auf meinem Computer (macOS, mongodb v3.4.10, installiert mit homebrew) seltsamerweise nicht funktioniert :
Error parsing command line: unrecognised option '--shutdown'

PPS
(macOS-spezifisch) Bevor sich jemand fragt: Nein, ich konnte es nicht mit einem Befehl stoppen,
brew services stop mongodb
weil ich es nicht gestartet habe
brew services start mongodb.
Ich hatte mongodmit einer benutzerdefinierten Befehlszeile begonnen :-)

t0r0X
quelle
Tolle Antwort, die bestätigte, dass MongoDB mit dem SIGTERM-Signal ordnungsgemäß beendet werden kann. Es ist wichtig, wenn MongoDB in einem Docker ausgeführt wird - docs.docker.com/compose/compose-file/#stop_grace_period . Zusätzlicher Hinweis, dass CMD ["mongod", "option", "option"] verwendet werden muss, um sicherzustellen, dass MongoDB PID 1 erhält. Das von Docker gesendete Signal erreicht dann Ihre DB.
Laimison
9

Verwenden mongod --shutdown

Laut offiziellem Dokument: Managing-Mongodb-Prozesse /

: D.

Shawn Wang
quelle
Das habe ich gesucht. Vielen Dank.
Gaurav Sharma
Prozess konnte nicht abgebrochen werden: errno: 1 Vorgang nicht zulässig.
htm11h
Das hat nur bei mir funktioniert. Ich habe kein Mongod als Dienst und der Startbefehl zeigte einen Fehler an, wenn eine Instanz von Mongod bereits ausgeführt wird. Vielen Dank, Mann!
Sanjeet A
8

Mein Sonderfall ist:

zuvor mongod starten von:

sudo -u mongod mongod -f /etc/mongod.conf

jetzt will aufhören mongod.

und beziehen Sie sich auf offizielles Dokument Stop mongod Processes , hat versucht:

(1) shutdownServeraber fehlgeschlagen:

> use admin
switched to db admin
> db.shutdownServer()
2019-03-06T14:13:15.334+0800 E QUERY    [thread1] Error: shutdownServer failed: {
        "ok" : 0,
        "errmsg" : "shutdown must run from localhost when running db without auth",
        "code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.shutdownServer@src/mongo/shell/db.js:302:1
@(shell):1:1

(2) --shutdownimmer noch fehlgeschlagen:

# mongod --shutdown
There doesn't seem to be a server running with dbpath: /data/db

(3) vorheriger Startbefehl, der --shutdown hinzufügt:

sudo -u mongod mongod -f /etc/mongod.conf --shutdown
killing process with pid: 30213
failed to kill process: errno:1 Operation not permitted

(4) verwenden service, um zu stoppen:

service mongod stop

und

service mongod status

show erwartet Active: inactive (dead), läuft aber mongodtatsächlich noch , denn Prozess von ps kann man sehen:

# ps -edaf | grep mongo | grep -v grep
root     30213     1  0 Feb04 ?        03:33:22 mongod --port PORT --dbpath=/var/lib/mongo

und schließlich wirklich aufhören mongod vorbei:

# sudo mongod -f /etc/mongod.conf --shutdown
killing process with pid: 30213

bis jetzt Grundursache: noch unbekannt ...

Hoffnung oben Lösung ist nützlich für Ihre.

Crifan
quelle
6

Erstellen Sie eine Datei mit dem Namen mongostop.bat

Speichern Sie den folgenden Code darin

 mongo admin --eval "db.shutdownServer()"

Führen Sie die Datei mongostop.bat aus und Sie haben mongo erfolgreich gestoppt

Adeojo Emmanuel IMM
quelle
4

Ein Liner zum Starten oder Stoppen des Mongodb-Dienstes über die Befehlszeile;

  1. So starten Sie den Dienst: NET START MONGODB
  2. So beenden Sie den Dienst: NET STOP MONGODB

Ich benutze das selbst, es funktioniert.

Pirira
quelle
Ich erhalte dies bei Verwendung der folgenden Befehle unter Windows: c: \ mongodb \ bin> NET START MONGODB Der Dienstname ist ungültig. Weitere Hilfe erhalten Sie, indem Sie NET HELPMSG 2185 eingeben. C: \ mongodb \ bin> NET STOP MONGODB Der Dienstname ist ungültig. Weitere Hilfe erhalten Sie, indem Sie NET HELPMSG
Unter Windows müssen Sie zuerst mongodb als Dienst mit der Option --install installieren. Mit den Befehlen können Sie einen Befehl ähnlich dem folgenden verwenden, um ihn als Dienst zu installieren. mongod --install --directoryperdb --dbpath C: \ mongodb-win32-x86_64-2.4.6 \ data --logpath C: \ mongodb-win32-x86_64-2.4.6 \ log \ mongodb.log --logappend - rest Der obige Befehl muss mit Administratorrechten ausgeführt werden. Danach können Sie die von Hugo bereitgestellten Befehle net start und net stop verwenden.
Ed Ost
3

Von den gegebenen Befehlen denke ich, dass Sie unter Linux sind.

Starten Sie MongoDB:

$ sudo service mongod start
mongod start/running, process XXXXX 

Überprüfen Sie den Status:

$ sudo service mongod status
mongod start/running, process XXXXX 

Stop MongoDB:

$ sudo service mongod stop
mongod stop/waiting 
ranafeb14
quelle
2

Aufbauend auf der Antwort von stennie:

mongo --eval "db.getSiblingDB('admin').shutdownServer();quit()"

Ich stellte fest, dass Mongo nach dem Herunterfahren des Servers versuchte, die Verbindung zur Datenbank wiederherzustellen, was zu Verzögerungen und Fehlermeldungen führen würde. Das Hinzufügen von quit () nach dem Herunterfahren beschleunigt und reduziert die Nachrichten, aber es gibt noch eine.

Ich möchte auch Kontext hinzufügen - ich starte und stoppe mongod als Teil von Testfällen für anderen Code, sodass die Registrierung als Dienst nicht zum Anwendungsfall passt. Ich hoffe, dass ich etwas bekomme, das auf allen Plattformen läuft (dies wird derzeit in Windows getestet). Ich benutze Mongod 3.6.9

David Fridley
quelle
1

Ich habe einfach getan:

quit();

Bitte beachten Sie, dass ich Mongo 3.0 verwende.

Mongo

Felipe Alarcon
quelle
Wenn Sie in einer VM ausgeführt werden, stoppt dieser Befehl nur die VM.
htm11h
1

Drücken Sie im Terminalfenster Ihres Mac Strg + c

Shyamal
quelle
Jemand hat das abgelehnt. Dies ist in der Tat eine der Möglichkeiten, Mongo gemäß der Mongo-Dokumentation zu stoppen. In den meisten Situationen funktioniert dies nicht, da Mongo in diesem Terminal und nicht im Hintergrund oder als Dämon ausgeführt werden sollte, aber "manchmal" funktioniert diese Lösung. Bei der Abstimmung ist es schön zu erklären, warum
TanisDLJ
1

Verwenden von Homebrew (empfohlener Weg):

Anfangen:

brew services start mongodb-community

Stoppen:

brew services stop mongodb-community

nitin.agam
quelle
0

Ich benutze dieses Startskript unter Ubuntu.

#!/bin/sh

### BEGIN INIT INFO
# Provides:     mongodb
# Required-Sart:
# Required-Stop:
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description: mongodb
# Description: mongo db server
### END INIT INFO

. /lib/lsb/init-functions

PROGRAM=/opt/mongo/bin/mongod
MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

test -x $PROGRAM || exit 0

case "$1" in
  start)
     log_begin_msg "Starting MongoDB server"
         ulimit -v unlimited.
         ulimit -n 100000
     /opt/mongo/bin/mongod --fork --quiet --dbpath /data/db --bind_ip 127.0.0.1 --rest   --config /etc/mongod.conf.
     log_end_msg 0
     ;;
  stop)
     log_begin_msg "Stopping MongoDB server"
     if [ ! -z "$MONGOPID" ]; then
kill -15 $MONGOPID
     fi
     log_end_msg 0
     ;;
  status)
     ;;
  *)
     log_success_msg "Usage: /etc/init.d/mongodb {start|stop|status}"
     exit 1
esac

exit 0
Boris Ivanov
quelle
2
Du tötest mongoDB also direkt, oder? Ich bin ein Anfänger von MongoDB. Gibt es irgendwelche Schmerzen, um es zu töten? Ich weiß, dass SQLServer oder Oracle Probleme haben werden, wenn wir sie einfach töten.
XiaoYao
zu töten ist -9 aber -15 u SIGNAL senden.
Boris Ivanov
0

Windows

In PowerShell ist es: Stop-Service MongoDB

Dann, um es erneut zu starten: Start-Service MongoDB

Führen Sie Folgendes aus, um zu überprüfen, ob es gestartet wurde : net start | findstr MongoDB.

Hinweis: Oben wird davon ausgegangen, dass MongoDB als Dienst registriert ist .

Kenorb
quelle
0

Nutzen Sie den Task-Manager Ihres Betriebssystems für eine schnelle und einfache Lösung. Unten sehen Sie das Screenshot von / für Windows 10. Klicken Sie mit der rechten Maustaste auf den markierten Prozess und wählen Sie Stopp . Wählen Sie Start , falls bereits gestoppt.

Geben Sie hier die Bildbeschreibung ein

Bitte beachten Sie: Intern tun die Befehle dasselbe, was Sie manuell über eine von Windows / Ihrem Betriebssystem bereitgestellte GUI (Task Manager) tun müssen. Dieser Ansatz sollte jedoch für Studien- / Übungszwecke verwendet werden, um zu beginnen, und Sie werden aufgrund dessen nicht blockiert.

unmöglich
quelle
-2

STRG + C.

in der Windows-Befehlszeile

Vincent T.
quelle