Come interrompere mongo DB in un comando


159

Devo essere in grado di avviare / arrestare MongoDB sul cli. È abbastanza semplice iniziare:

./mongod

Ma per interrompere mongo DB, devo prima eseguire mongo shell aperta e poi digitare due comandi:

$ ./mongo

usa admin

db.shutdownServer ()

Quindi non so come fermare mongo DB in una riga. Qualsiasi aiuto?

Risposte:


226

L'avvio e l'arresto di MongoDB sono trattati nel manuale MongoDB. Spiega le varie opzioni di arresto di MongoDB tramite shell, cli, driver ecc. Descrive inoltre i rischi di arresto errato di MongoDB (come la corruzione dei dati) e parla dei diversi segnali di kill.

Inoltre, se MongoDB è stato installato usando un gestore pacchetti per Ubuntu o Debian, è possibile interrompere mongodb (attualmente mongod in ubuntu) come segue:

  • upstart: sudo service mongod stop

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

O su Mac OS X

O su sistemi basati su Red Hat :

  • service mongod stop

O su Windows se è stato installato come servizio denominato MongoDB:

  • net stop MongoDB

E se non installato come servizio (a partire da Windows 7+) è possibile eseguire:

  • taskkill /f /im mongod.exe

Per ulteriori informazioni sui problemi di un arresto impuro, su come evitare al meglio uno scenario del genere e cosa fare in caso di arresto impuro, consultare: Ripristino dei dati dopo un arresto imprevisto .


5
Credo che l'ordine per il servizio sia sudo service mongodb [start|stop|restart|status]. sudo service stop mongodbrisulta in: fermata: servizio non riconosciuto
jacob,

2
@Jacob - Abbiamo appena provato questo su Ubuntu, hai ragione, ho modificato la risposta.
Andrew M,

5
Per Mac, puoi anche semplicemente fare "killall mongod". In questo modo, non è necessario conoscere il PID.
Jon M

2
O su Mac: 'ps -ax | grep mongod ', quindi uccidi il numero del processo
Bryan Grace,

1
Nel nuovo Ubuntu 18.04, sono in grado di fermarlo usando> sudo service mongod stop ... non "mongodb"
Naseef Ummer

101

Se desideri letteralmente una riga equivalente ai comandi nella tua domanda originale, puoi alias:

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

La risposta di Mark sull'avvio e l'arresto di MongoDB tramite i servizi è l'approccio amministrativo più tipico (e raccomandato).


3
Bella risposta. Quando si impostano più istanze sulla macchina di sviluppo (provando il set di repliche prima della distribuzione), è utile avere un .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 ... e quindi avere 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 ...
Sviluppatore Marius Žilėnas,

2
Su Windows dove è installato come servizio, ho scoperto che net stop MongoDBnon era attendibile, quindi ho usato qualcosa di simile: mongo admin --eval "db.shutdownServer()". Saluti!
NateJ,

1
@Stennie Quando utilizzo "net stop MongoDB" su Windows, viene visualizzato "Errore di sistema 1067 occorso"
charan tej

48

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

Maggiori informazioni su ufficiale: http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/


Adoro usare questo modo, funziona anche senza dbpath, ha senso se hai solo un'istanza in esecuzione.
Radtek,

2
sembra che non funzioni per le versioni più recenti, dalla 2.4.xx alla più recente.
alexserver,

Questa è l'unica risposta che ho visto che ha funzionato davvero.
David Betz,

6
MacOS 10.12, mongod v3.4.10: Error parsing command line: unrecognised option '--shutdown':-(
t0r0X

Esiste un comportamento definito per questo se viene eseguito su un primario di un set di repliche? Sembra comportarsi come quello db.shutdownServer({force:1,timeoutSecs:0})che inibirebbe lo svuotamento dei dati rimanenti ai secondari. Potresti non volerlo sempre.
Daniel F,

30

Se il server è in esecuzione come processo di primo piano in un terminale, è possibile farlo premendo

Ctrl-C

Un altro modo per arrestare in modo pulito un server in esecuzione è utilizzare il comando shutdown,

> use admin
> db.shutdownServer();

Altrimenti, un comando come kill può essere usato per inviare il segnale. Se mongod ha 10014 come PID, il comando sarebbe

kill -2 10014

3
L'uso di kill non è una buona idea, questo potrebbe portare a un DB rotto, che necessita di una riparazione per il riavvio. "Non usare mai kill -9 (cioè SIGKILL) per terminare un'istanza di mongod." Documenti: docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…
Jens A. Koch,

7
@ JensA.Koch Ya, Nanhe non stava dicendo a nessuno di usare un segnale -9, quindi .. dicendo "usare kill non è una buona idea" semplicemente non è preciso. Solo la risoluzione istantanea non è sicura: una normale uccisione è perfettamente sicura e la documentazione che hai collegato è a favore di essa.
BT,

18

Ho seguito la documentazione ufficiale MongoDB per fermarmi con i segnali. È possibile utilizzare uno dei seguenti comandi (PID rappresenta Process IDil mongodprocesso):

kill PID

che invia il segnale 15 (SIGTERM), o

kill -2 PID

che invia il segnale 2 (SIGINT).

Avvertenza dalla documentazione MongoDB :
non usare mai kill -9(es. SIGKILL) per terminare mongodun'istanza.

Se hai più di un'istanza in esecuzione o non ti interessa il PID, puoi utilizzare pkillper inviare il segnale a tutti i mongodprocessi in esecuzione :

pkill mongod

o

pkill -2 mongod

o, molto più sicuro, solo per i processi che ti appartengono:

pkill -U $USER mongod

o

pkill -2 -U $USER mongod


Nota PS : ho fatto ricorso a questa opzione, perché mongod --shutdown, sebbene menzionato nella documentazione MongoDB corrente , curiosamente non funziona sulla mia macchina (macOS, mongodb v3.4.10, installato con homebrew):
Error parsing command line: unrecognised option '--shutdown'

PPS
(specifico per macOS) Prima che qualcuno si chieda: no, non ho potuto fermarlo con il comando
brew services stop mongodb
perché non l'ho avviato
brew services start mongodb.
Avevo iniziato mongodcon una riga di comando personalizzata :-)


Ottima risposta, che ha confermato che MongoDB può essere terminato con grazia utilizzando il segnale SIGTERM. È importante se si esegue MongoDB in una Docker - docs.docker.com/compose/compose-file/#stop_grace_period . Inoltre, è necessario utilizzare CMD ["mongod", "opzione", "opzione"] per assicurarsi che MongoDB riceva il PID 1, quindi il segnale inviato da Docker raggiungerà il DB.
laime

9

Uso mongod --shutdown

Secondo il documento ufficiale: manage-mongodb-processi /

: D


Questo è quello che stavo cercando. Molte grazie.
Gaurav Sharma,

Processo di interruzione non riuscito: errno: 1 Operazione non consentita.
h11,


Questo è ciò che ha funzionato solo per me. Non ho mongod come servizio e il comando di avvio mostrava errore è che un'istanza di mongod è già in esecuzione. Grazie mille, amico!
Sanjeet,

8

Il mio caso speciale è:

precedentemente avviato mongod da:

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

ora, voglio smettere mongod .

e consultare il documento ufficiale Stop mongod Processes , ha provato:

(1) shutdownServerma non riuscito:

> 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) --shutdownancora fallito:

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

(3) comando di avvio precedente aggiungendo --shutdown:

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

(4) utilizzare serviceper interrompere:

service mongod stop

e

service mongod status

mostra previsto Active: inactive (dead)ma in mongodrealtà ancora in esecuzione, poiché può vedere il processo da ps:

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

e infine , smetti davvero di mongod:

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

fino ad ora, causa principale: ancora sconosciuta ...

spero che la soluzione sopra sia utile per il tuo.


6

crea un file chiamato mongostop.bat

salva il seguente codice in esso

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

esegui il file mongostop.bat e mongo si è arrestato correttamente


4

One liner per avviare o interrompere il servizio mongodb utilizzando la riga di comando;

  1. Per avviare il servizio utilizzare: NET START MONGODB
  2. Per interrompere il servizio utilizzare: NET STOP MONGODB

Lo uso da solo, funziona.


Ottengo questo usando quei comandi su Windows: c: \ mongodb \ bin> NET START MONGODB Il nome del servizio non è valido. Ulteriori informazioni sono disponibili digitando NET HELPMSG 2185. c: \ mongodb \ bin> NET STOP MONGODB Il nome del servizio non è valido. Ulteriori informazioni sono disponibili digitando NET HELPMSG 2185.

Su Windows devi prima installare mongodb come servizio usando l'opzione --install. I comandi è possibile utilizzare un comando simile al seguente per installarlo come servizio. 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 - resto Il comando sopra deve essere eseguito con i privilegi di amministratore. Fatto ciò, puoi usare i comandi net start e net stop forniti da Hugo.
Ed Ost,

3

Dai comandi dati penso che tu sia su Linux.

Avvia MongoDB:

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

Controlla lo stato:

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

Stop MongoDB:

$ sudo service mongod stop
mongod stop/waiting 

2

Sulla base della risposta di stennie:

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

Ho scoperto che mongo stava cercando di riconnettersi al db dopo lo spegnimento del server, il che avrebbe causato un ritardo e messaggi di errore. L'aggiunta di quit () dopo l'arresto accelera e riduce i messaggi, ma ce n'è ancora uno.

Voglio anche aggiungere un contesto: sto avviando e arrestando mongod come parte dei casi di test per altri codici, quindi la registrazione come servizio non si adatta al caso d'uso. Spero di finire con qualcosa che funziona su tutte le piattaforme (questo testato in Windows in questo momento). Sto usando mongod 3.6.9


1

Ho semplicemente fatto:

quit();

Nota che sto usando mongo 3.0.

Mongo


Se stavi eseguendo una VM, quel comando avrebbe semplicemente fermato la VM.
h11,

1

nella finestra del terminale sul Mac, premi control + c


Qualcuno ha votato in negativo. È, infatti, uno dei modi per fermare il mongo secondo la documentazione del mongo. Nella maggior parte dei casi questo non funzionerà, poiché mongo dovrebbe essere in esecuzione in quel terminale e non in background o come un demone, ma "a volte" questa soluzione funzionerà. Nel downvoting è bello spiegare perché
TanisDLJ

1

Utilizzando homebrew (modo consigliato):

Iniziare:

brew services start mongodb-community

Fermare:

brew services stop mongodb-community


0

Uso questo script di avvio su 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

2
Quindi uccidi direttamente mongoDB, giusto? Sono un principiante di MongoDB, c'è qualche male ad ucciderlo? So che per SQL Server o Oracle, incontreranno problemi se li uccidiamo.
XiaoYao,

uccidere è -9 ma -15 invia SEGNALE.
Boris Ivanov il

0

finestre

In PowerShell, è: Stop-Service MongoDB

Quindi per riavviarlo: Start-Service MongoDB

Per verificare se è stato avviato, eseguire: net start | findstr MongoDB .

Nota: sopra presuppone che MongoDB sia registrato come servizio .


0

Sfrutta gentilmente il Task Manager fornito dal tuo sistema operativo per una soluzione semplice e veloce. Di seguito è riportato lo screengrab da / per Windows 10. Fare clic con il tasto destro del mouse sul processo evidenziato e selezionare stop . Seleziona start , se già interrotto.

inserisci qui la descrizione dell'immagine

Nota: internamente i comandi stanno facendo la stessa cosa che devi fare manualmente usando una GUI (Task Manager), fornita da Windows / dal tuo sistema operativo. Tuttavia, questo approccio deve essere utilizzato a scopo di studio / pratica per iniziare e non sarai bloccato a causa di ciò.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.