Jak zatrzymać mongo DB jednym poleceniem

159

Muszę być w stanie uruchomić / zatrzymać MongoDB w CLI. Rozpoczęcie jest dość proste:

./mongod

Ale aby zatrzymać mongo DB, muszę najpierw uruchomić otwartą powłokę mongo, a następnie wpisać dwa polecenia:

$ ./mongo

użyj admin

db.shutdownServer ()

Więc nie wiem, jak zatrzymać mongo DB w jednej linii. Jakaś pomoc?

XiaoYao
źródło

Odpowiedzi:

226

Uruchamianie i zatrzymywanie MongoDB jest opisane w podręczniku MongoDB. Wyjaśnia różne opcje zatrzymywania MongoDB przez powłokę, kliknięcie, sterowniki itp. Zawiera również szczegółowe informacje na temat zagrożeń związanych z nieprawidłowym zatrzymaniem MongoDB (takich jak uszkodzenie danych) i omawia różne sygnały zabicia.

Dodatkowo, jeśli zainstalowałeś MongoDB przy użyciu menedżera pakietów dla Ubuntu lub Debian , możesz zatrzymać mongodb (obecnie mongod w ubuntu) w następujący sposób:

  • Dorobkiewicz: sudo service mongod stop

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

Lub w systemie Mac OS X

Lub w systemach opartych na Red Hat :

  • service mongod stop

Lub w systemie Windows, jeśli zainstalowałeś jako usługę o nazwie MongoDB:

  • net stop MongoDB

A jeśli nie jest zainstalowany jako usługa (od Windows 7+), możesz uruchomić:

  • taskkill /f /im mongod.exe

Aby dowiedzieć się więcej o problemach związanych z nieczystym wyłączeniem, jak najlepiej uniknąć takiego scenariusza i co zrobić w przypadku nieczystego wyłączenia, zobacz: Odzyskiwanie danych po nieoczekiwanym wyłączeniu .

Mark Hillick
źródło
5
Uważam, że zamówienie na usługę jest sudo service mongodb [start|stop|restart|status]. sudo service stop mongodbskutkuje: stop: nierozpoznana usługa
jacob
2
@Jacob - Właśnie wypróbowaliśmy to na Ubuntu, masz rację, zredagowałem odpowiedź.
Andrew M
5
W przypadku komputerów Mac możesz też po prostu wykonać polecenie „killall mongod”. W ten sposób nie musisz znać PID.
Jon M
2
Lub na komputerze Mac: „ps -ax | grep mongod ', a następnie zabij numer procesu
Bryan Grace
1
W nowym Ubuntu 18.04 mogę go zatrzymać za pomocą> usługi sudo mongod stop ... nie "mongodb"
Naseef Ummer
101

Jeśli dosłownie chcesz, aby jeden wiersz odpowiadał poleceniom z pierwotnego pytania, możesz alias:

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

Odpowiedź Marka dotycząca uruchamiania i zatrzymywania MongoDB za pośrednictwem usług jest bardziej typowym (i zalecanym) podejściem administracyjnym.

Stennie
źródło
3
Świetna odpowiedź. Podczas konfigurowania wielu instancji na komputerze deweloperskim (próba replikacji zestawu przed wdrożeniem) dobrze jest mieć plik .bat, 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 ... a następnie 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 ...
Deweloper Marius Žilėnas
2
W systemie Windows, gdzie jest zainstalowany jako usługa, stwierdziliśmy, że net stop MongoDBnie był niezawodny, więc użyłem coś podobnego: mongo admin --eval "db.shutdownServer()". Twoje zdrowie!
NateJ,
1
@Stennie Kiedy używam „net stop MongoDB” w systemie Windows, wyświetla się komunikat „Wystąpił błąd systemu 1067”
charan tej
48

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

Więcej informacji na oficjalnym: http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/

francoisrv
źródło
Uwielbiam używać tego sposobu, działa również bez dbpath, ma sens, jeśli masz uruchomioną tylko jedną instancję.
radtek
2
wygląda na to, że nie działa w nowszych wersjach, od 2.4.xx do najnowszej.
alexserver
To jedyna odpowiedź, jaką widziałem, która faktycznie zadziałała.
David Betz
6
MacOS 10,12, mongod v3.4.10: Error parsing command line: unrecognised option '--shutdown':-(
t0r0X
Czy istnieje zdefiniowane zachowanie, jeśli jest uruchamiane na podstawowym zestawie replik? Wygląda na to, że zachowuje się tak, jakby db.shutdownServer({force:1,timeoutSecs:0})powstrzymywał przepływ pozostałych danych do części wtórnych. Nie zawsze możesz tego chcieć.
Daniel F
30

Jeśli serwer działa jako proces pierwszoplanowy w terminalu, można to zrobić naciskając

Ctrl-C

Innym sposobem czystego zamknięcia działającego serwera jest użycie polecenia shutdown,

> use admin
> db.shutdownServer();

W przeciwnym razie do wysłania sygnału można użyć polecenia typu kill. Jeśli mongod ma 10014 jako swój PID, polecenie byłoby takie

kill -2 10014
Nanhe Kumar
źródło
3
Używanie kill nie jest dobrym pomysłem, może to prowadzić do zepsutej bazy danych, która wymaga naprawy przed ponownym uruchomieniem. „Nigdy nie używaj kill -9 (tj. SIGKILL) do zakończenia instancji mongod.” Dokumenty: docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…
Jens A. Koch
7
@ JensA.Koch Tak, Nanhe nikomu nie mówiła, żeby używał sygnału -9, więc ... mówienie „użycie zabijania nie jest dobrym pomysłem” po prostu nie jest dokładne. Tylko natychmiastowe zakończenie jest niebezpieczne - normalne zabicie jest całkowicie bezpieczne, a dokumentacja, z którą łączysz się, jest za tym zgodna.
BT,
18

Postępowałem zgodnie z oficjalną dokumentacją MongoDB dotyczącą zatrzymywania się z sygnałami. Jednym z Mogą być stosowane następujące polecenia (PID reprezentuje Process IDw mongodprocesie)

kill PID

który wysyła sygnał 15 (SIGTERM) lub

kill -2 PID

który wysyła sygnał 2 (SIGINT).

Ostrzeżenie z dokumentacji MongoDB :
Nigdy nie używaj kill -9(tj. SIGKILL) do zakończenia mongodinstancji.

Jeśli masz uruchomionych więcej niż jedną instancję lub nie obchodzi Cię PID, możesz użyć pkilldo wysłania sygnału do wszystkich uruchomionych mongodprocesów:

pkill mongod

lub

pkill -2 mongod

lub, dużo bezpieczniej, tylko do procesów należących do Ciebie:

pkill -U $USER mongod

lub

pkill -2 -U $USER mongod


Uwaga PS : skorzystałem z tej opcji, ponieważ mongod --shutdownchociaż wspomniano o tym w aktualnej dokumentacji MongoDB , co ciekawe, nie działa na moim komputerze (macOS, mongodb v3.4.10, zainstalowany z homebrew):
Error parsing command line: unrecognised option '--shutdown'

PPS
(specyficzny dla macOS) Zanim ktoś się zastanowi: nie, nie mogłem go zatrzymać poleceniem,
brew services stop mongodb
ponieważ nie uruchomiłem go
brew services start mongodb.
Zacząłem mongodod niestandardowej linii poleceń :-)

t0r0X
źródło
Świetna odpowiedź, która potwierdziła, że ​​MongoDB można z wdziękiem zakończyć za pomocą sygnału SIGTERM. Jest to ważne, jeśli uruchamiasz MongoDB w Dockerze - docs.docker.com/compose/compose-file/#stop_grace_period . Dodatkowa uwaga, że ​​CMD ["mongod", "opcja", "opcja"] musi być użyte, aby upewnić się, że MongoDB otrzyma PID 1, a następnie sygnał wysłany przez Docker dotrze do twojej bazy danych.
laimison
9

Posługiwać się mongod --shutdown

Według oficjalnego dokumentu: manage-mongodb-Processes /

:RE

Shawn Wang
źródło
To jest to, czego szukałem. Wielkie dzięki.
Gaurav Sharma
Nie udało się zabić procesu: errno: 1 Operacja niedozwolona.
htm11h
To działało tylko dla mnie. Nie mam mongod jako usługi, a polecenie startu pokazywało błąd oznacza, że ​​instancja mongod jest już uruchomiona. Wielkie dzięki, stary!
Sanjeet A
8

Mój przypadek szczególny to:

poprzednio uruchom mongod przez:

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

teraz chcę przestać mongod.

i zapoznaj się z oficjalnym dokumentem Stop mongod Processes , próbował:

(1) shutdownServerale nie powiodło się:

> 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) --shutdownnadal nie powiodło się:

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

(3) dodanie poprzedniego polecenia startu - wyłączanie:

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

(4) użyj, serviceaby zatrzymać:

service mongod stop

i

service mongod status

show oczekiwane, Active: inactive (dead)ale mongodfaktycznie nadal działa, ponieważ można zobaczyć proces z ps:

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

i wreszcie naprawdę zatrzymaj mongod:

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

do tej pory główna przyczyna: wciąż nieznana ...

Mam nadzieję, że powyższe rozwiązanie jest przydatne dla twojego.

crifan
źródło
6

utwórz plik o nazwie mongostop.bat

zapisz w nim następujący kod

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

uruchom plik mongostop.bat i pomyślnie zatrzymałeś mongo

Adeojo Emmanuel IMM
źródło
4

Jedna linijka do uruchamiania lub zatrzymywania usługi mongodb za pomocą wiersza poleceń;

  1. Aby rozpocząć korzystanie z usługi: NET START MONGODB
  2. Aby przerwać korzystanie z usługi: NET STOP MONGODB

Sam tego używam, to działa.

Pirira
źródło
Rozumiem to za pomocą tych poleceń w systemie Windows: c: \ mongodb \ bin> NET START MONGODB Nazwa usługi jest nieprawidłowa. Więcej pomocy można uzyskać, wpisując NET HELPMSG 2185. c: \ mongodb \ bin> NET STOP MONGODB Nazwa usługi jest nieprawidłowa. Więcej pomocy można uzyskać, wpisując NET HELPMSG 2185.
W systemie Windows należy najpierw zainstalować mongodb jako usługę przy użyciu opcji --install. Polecenia, których możesz użyć polecenia podobnego do poniższego, aby zainstalować go jako usługę. 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 - reszta Powyższe polecenie musi być uruchomione z uprawnieniami administratora. Po zakończeniu możesz użyć poleceń net start i net stop dostarczonych przez Hugo.
Ed Ost
3

Z podanych poleceń myślę, że jesteś na Linuksie.

Uruchom MongoDB:

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

Sprawdzić stan:

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

Zatrzymaj MongoDB:

$ sudo service mongod stop
mongod stop/waiting 
ranafeb14
źródło
2

Opierając się na odpowiedzi od Stennie:

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

Okazało się, że mongo próbowało ponownie połączyć się z bazą danych po wyłączeniu serwera, co powodowało opóźnienia i komunikaty o błędach. Dodanie quit () po zamknięciu systemu przyspiesza działanie i redukuje komunikaty, ale wciąż jest jeden.

Chcę też dodać kontekst - uruchamiam i zatrzymuję mongod w ramach przypadków testowych dla innego kodu, więc rejestracja jako usługa nie pasuje do przypadku użycia. Mam nadzieję, że w końcu uda mi się uzyskać coś, co działa na wszystkich platformach (testowane teraz w systemie Windows). Używam mongod 3.6.9

David Fridley
źródło
1

Po prostu zrobiłem:

quit();

Uwaga: używam mongo 3.0.

Mongo

Felipe Alarcon
źródło
Jeśli działasz na maszynie wirtualnej, to polecenie po prostu zatrzymałoby maszynę wirtualną.
htm11h
1

W oknie terminala na Macu naciśnij Ctrl + C

Shyamal
źródło
Ktoś to zlekceważył. W rzeczywistości jest to jeden ze sposobów na powstrzymanie mongo zgodnie z dokumentacją mongo. W większości sytuacji to nie zadziała, ponieważ mongo powinno działać w tym terminalu, a nie w tle lub jako demon, ale „czasami” to rozwiązanie zadziała. Podczas głosowania w dół dobrze jest wyjaśnić, dlaczego
TanisDLJ
1

Korzystanie z homebrew (zalecany sposób):

Zacząć:

brew services start mongodb-community

Zatrzymać:

brew services stop mongodb-community

nitin.agam
źródło
0

Używam tego skryptu startowego na 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
Borys Iwanow
źródło
2
Więc po prostu zabijasz mongoDB bezpośrednio, prawda? Jestem początkującym użytkownikiem MongoDB, czy są jakieś rany, aby go zabić? Wiem, że jeśli chodzi o SQLServer lub Oracle, napotkają problemy, jeśli ich po prostu zabijemy.
XiaoYao
zabić to -9, ale -15 wysyła sygnał.
Borys Iwanow
0

Windows

W PowerShell jest to: Stop-Service MongoDB

Następnie, aby rozpocząć od nowa: Start-Service MongoDB

Aby sprawdzić, czy to się zaczęło, uruchom: net start | findstr MongoDB.

Uwaga: powyżej założono, że MongoDB jest zarejestrowany jako usługa .

kenorb
źródło
0

Prosimy o skorzystanie z Menedżera zadań dostarczonego przez system operacyjny, aby uzyskać szybkie i łatwe rozwiązanie. Poniżej znajduje się zrzut ekranu z / dla Windows 10. Kliknij prawym przyciskiem myszy podświetlony proces i wybierz zatrzymaj . Wybierz start , jeśli już został zatrzymany.

wprowadź opis obrazu tutaj

Uwaga: wewnętrznie polecenia robią to samo, co musisz zrobić ręcznie za pomocą GUI (Menedżera zadań), dostarczanego przez system Windows / system operacyjny. Jednak to podejście powinno być używane do nauki / ćwiczeń, aby rozpocząć, i nie zostaniesz z tego powodu zablokowany.

możliwe
źródło
-2

CTRL + C

w wierszu poleceń systemu Windows

Vincent T.
źródło