Cómo detener mongo DB en un comando

159

Necesito poder iniciar / detener MongoDB en el cli. Es bastante simple comenzar:

./mongod

Pero para detener mongo DB, primero necesito ejecutar mongo shell abierto y luego escribir dos comandos:

$ ./mongo

usar administrador

db.shutdownServer ()

Entonces no sé cómo detener mongo DB en una línea. ¿Alguna ayuda?

XiaoYao
fuente

Respuestas:

226

Iniciar y detener MongoDB está cubierto en el manual de MongoDB. Explica las diversas opciones de detener MongoDB a través del shell, cli, controladores, etc. También detalla los riesgos de detener incorrectamente MongoDB (como la corrupción de datos) y habla sobre las diferentes señales de muerte.

Además, si ha instalado MongoDB usando un administrador de paquetes para Ubuntu o Debian , puede detener mongodb (actualmente mongod en ubuntu) de la siguiente manera:

  • Advenedizo: sudo service mongod stop

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

O en Mac OS X

O en sistemas basados en Red Hat :

  • service mongod stop

O en Windows si ha instalado como un servicio llamado MongoDB:

  • net stop MongoDB

Y si no está instalado como un servicio (a partir de Windows 7+) puede ejecutar:

  • taskkill /f /im mongod.exe

Para obtener más información acerca de los problemas de un cierre no limpio, cómo evitarlo y qué hacer en caso de un cierre no limpio, consulte: Recuperar datos después de un cierre inesperado .

Mark Hillick
fuente
55
Creo que la orden de servicio es sudo service mongodb [start|stop|restart|status]. sudo service stop mongodbresultados en: detener: servicio no reconocido
jacob
2
@Jacob: acabamos de probar esto en ubuntu, tienes razón, he editado la respuesta.
Andrew M
55
Para Mac, también puedes hacer 'killall mongod'. De esa manera, no necesita saber el PID.
Jon M
2
O en Mac: 'ps -ax | grep mongod ', luego elimine el número de proceso
Bryan Grace
1
En el nuevo Ubuntu 18.04, puedo detenerlo usando> sudo service mongod stop ... no "mongodb"
Ummer
101

Si literalmente quiere una línea equivalente a los comandos en su pregunta original, puede usar un alias:

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

La respuesta de Mark al iniciar y detener MongoDB a través de los servicios es el enfoque administrativo más típico (y recomendado).

Stennie
fuente
3
Gran respuesta. Al configurar varias instancias en la máquina de desarrollo (probar el conjunto de replicación antes de la implementación), ayuda tener 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 ... y luego tener 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 ...
Desarrollador Marius Žilėnas
2
En Windows donde se instala como un servicio, descubrí que net stop MongoDBno era fiable, por lo que utiliza algo similar: mongo admin --eval "db.shutdownServer()". ¡Salud!
NateJ
1
@Stennie Cuando uso el 'net stop MongoDB' en Windows muestra "Error del sistema 1067 ha ocurrido"
charan tej
48

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

Más información en oficial: http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/

francoisrv
fuente
Me encanta usarlo de esta manera, también funciona sin dbpath, tiene sentido si solo tienes una instancia en ejecución.
radtek
2
parece que no funciona para las versiones más nuevas, desde la 2.4.xx hasta la última.
alexserver
Esta es la única respuesta que he visto que realmente funcionó.
David Betz
66
macOS 10.12, mongod v3.4.10: Error parsing command line: unrecognised option '--shutdown':-(
t0r0X
¿Hay un comportamiento definido para esto si se ejecuta en un conjunto primario de réplica? Parece comportarse como db.shutdownServer({force:1,timeoutSecs:0})lo que inhibiría el vaciado de los datos restantes a las secundarias. Es posible que no siempre quieras eso.
Daniel F
30

Si el servidor se ejecuta como el proceso de primer plano en una terminal, esto se puede hacer presionando

Ctrl-C

Otra forma de cerrar limpiamente un servidor en ejecución es usar el comando shutdown,

> use admin
> db.shutdownServer();

De lo contrario, se puede usar un comando como kill para enviar la señal. Si mongod tiene 10014 como su PID, el comando sería

kill -2 10014
Nanhe Kumar
fuente
3
Usar kill no es una buena idea, esto puede conducir a una base de datos rota, que necesita una reparación para reiniciar. "Nunca use kill -9 (es decir, SIGKILL) para terminar una instancia mongod". Documentos: docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…
Jens A. Koch
77
@ JensA.Koch Ya, Nanhe no le estaba diciendo a nadie que usara una señal -9, así que ... decir "usar matar no es una buena idea" simplemente no es exacto. Solo la terminación instantánea es insegura: una muerte normal es perfectamente segura y la documentación a la que se vinculó lo defiende.
BT
18

Seguí la documentación oficial de MongoDB para detenerme con las señales. Se puede usar uno de los siguientes comandos (PID representa el Process IDdel mongodproceso):

kill PID

que envía la señal 15 (SIGTERM), o

kill -2 PID

que envía la señal 2 (SIGINT).

Advertencia de la documentación de MongoDB :
nunca use kill -9(es decir, SIGKILL) para terminar una mongodinstancia.

Si tiene más de una instancia ejecutándose o no le importa el PID, puede usar pkillpara enviar la señal a todos los mongodprocesos en ejecución :

pkill mongod

o

pkill -2 mongod

o, mucho más seguro, solo a los procesos que le pertenecen:

pkill -U $USER mongod

o

pkill -2 -U $USER mongod


Nota de PS : recurrí a esta opción porque mongod --shutdown, aunque se menciona en la documentación actual de MongoDB , curiosamente no funciona en mi máquina (macOS, mongodb v3.4.10, instalado con homebrew):
Error parsing command line: unrecognised option '--shutdown'

PPS
(específico de macOS) Antes de que alguien se pregunte: no, no pude detenerlo con el comando
brew services stop mongodb
porque no lo comencé con
brew services start mongodb.
Había comenzado mongodcon una línea de comando personalizada :-)

t0r0X
fuente
Gran respuesta, que confirmó que MongoDB puede terminarse con gracia usando la señal SIGTERM. Es importante si ejecuta MongoDB en un Docker: docs.docker.com/compose/compose-file/#stop_grace_period . Nota adicional que CMD ["mongod", "opción", "opción"] debe usarse para asegurarse de que MongoDB obtenga PID 1, luego la señal enviada por Docker llegará a su base de datos.
laimison
9

Utilizar mongod --shutdown

Según el documento oficial: manage-mongodb-projects /

:RE

Shawn Wang
fuente
Esto es lo que estaba buscando. Muchas gracias.
Gaurav Sharma el
Error al finalizar el proceso: errno: 1 Operación no permitida.
htm11h
Esto es lo que solo funcionó para mí. No tengo mongod como servicio y el comando de inicio mostraba un error, es una instancia de mongod que ya se está ejecutando. Muchas gracias, hombre!
Sanjeet A
8

Mi caso especial es:

previamente iniciar mongod por:

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

ahora, quiero parar mongod.

y consulte el documento oficial Stop mongod Processes , ha intentado:

(1) shutdownServerpero falló:

> 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) --shutdownaún falló:

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

(3) comando de inicio anterior agregando --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) usar servicepara detener:

service mongod stop

y

service mongod status

mostrar esperado Active: inactive (dead)pero en mongodrealidad todavía en ejecución, ya que puede ver el proceso desde ps:

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

y finalmente , realmente pare a mongod por:

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

hasta ahora, causa raíz: aún desconocida ...

Espero que la solución anterior sea útil para usted.

crifan
fuente
6

crear un archivo llamado mongostop.bat

guardar el siguiente código en él

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

ejecuta el archivo mongostop.bat y con éxito has detenido a mongo

Adeojo Emmanuel IMM
fuente
4

Uno delinea para iniciar o detener el servicio mongodb usando la línea de comando;

  1. Para iniciar el uso del servicio: NET START MONGODB
  2. Para detener el uso del servicio: NET STOP MONGODB

Lo uso yo mismo, funciona.

Pirira
fuente
Obtengo esto al usar esos comandos en Windows: c: \ mongodb \ bin> NET START MONGODB El nombre del servicio no es válido. Hay más ayuda disponible escribiendo NET HELPMSG 2185. c: \ mongodb \ bin> NET STOP MONGODB El nombre del servicio no es válido. Hay más ayuda disponible escribiendo NET HELPMSG 2185.
En Windows, primero debe instalar mongodb como servicio utilizando la opción --install. Los comandos pueden usar un comando similar al siguiente para instalarlo como un servicio. mongod --instalar --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 El comando anterior debe ejecutarse con privilegios de administrador. Una vez hecho esto, puede usar los comandos net start y net stop proporcionados por Hugo.
Ed Ost
3

De los comandos dados, creo que estás en Linux.

Inicie MongoDB:

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

Verifique el estado:

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

Detener MongoDB:

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

Sobre la base de la respuesta de stennie:

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

Descubrí que Mongo intentaba volver a conectarse a la base de datos después de que se cerró el servidor, lo que provocaría un retraso y mensajes de error. Agregar quit () después del apagado lo acelera y reduce los mensajes, pero todavía hay uno.

También quiero agregar contexto: estoy comenzando y deteniendo mongod como parte de los casos de prueba para otro código, por lo que registrarme como servicio no se ajusta al caso de uso. Espero terminar con algo que se ejecute en todas las plataformas (esto está probado en Windows en este momento). Estoy usando mongod 3.6.9

David Fridley
fuente
1

Simplemente hice:

quit();

Tenga en cuenta que estoy usando mongo 3.0.

Mongo

Felipe Alarcon
fuente
Si estaba ejecutando en una VM, ese comando simplemente detendría la VM.
htm11h
1

en la ventana de terminal en tu mac, presiona control + c

Shyamal
fuente
Alguien rechazó esto. De hecho, es una de las formas de detener a mongo de acuerdo con la documentación de mongo. En la mayoría de las situaciones, esto no funcionará, ya que Mongo debería ejecutarse en ese terminal y no en segundo plano o como un demonio, pero "a veces" esta solución funcionará. Al votar a favor, es bueno explicar por qué
TanisDLJ
1

Usando homebrew (forma recomendada):

Para comenzar:

brew services start mongodb-community

Para detener:

brew services stop mongodb-community

nitin.agam
fuente
0

Yo uso este script de inicio en 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
fuente
2
Entonces solo matas a mongoDB directamente, ¿verdad? Soy un principiante de MongoDB, ¿hay algún daño en matarlo? Sé que para SQLServer u Oracle, encontrarán problemas si los matamos.
XiaoYao
matar es -9 pero -15 envías SEÑAL.
Boris Ivanov
0

Ventanas

En PowerShell, es: Stop-Service MongoDB

Luego, para comenzar de nuevo: Start-Service MongoDB

Para verificar si se ha empezado, ejecute: net start | findstr MongoDB.

Nota: arriba se supone que MongoDB está registrado como un servicio .

kenorb
fuente
0

Aproveche el Administrador de tareas proporcionado por su sistema operativo para obtener una solución rápida y fácil. A continuación se muestra la captura de pantalla de / para Windows 10. Haga clic derecho en el proceso resaltado y seleccione detener . Seleccione inicio , si ya se detuvo.

ingrese la descripción de la imagen aquí

Nota: internamente, los comandos están haciendo lo mismo que usted tiene que hacer manualmente usando una GUI (Administrador de tareas), proporcionada por Windows / su sistema operativo. Sin embargo, este enfoque se utilizará con el propósito de estudiar / practicar para comenzar y no será bloqueado debido a esto.

imposible
fuente
-2

CTRL + C

en la línea de comando de windows

Vincent T.
fuente