Como parar o mongo DB em um comando


159

Eu preciso ser capaz de iniciar / parar o MongoDB no CLI. É bastante simples começar:

./mongod

Mas para parar o mongo DB, preciso primeiro abrir o shell mongo e depois digitar dois comandos:

$ ./mongo

use admin

db.shutdownServer ()

Portanto, não sei como parar o mongo DB em uma linha. Qualquer ajuda?

Respostas:


226

Iniciando e Parando o MongoDB é abordado no manual do MongoDB. Ele explica as várias opções de parada do MongoDB através do shell, cli, drivers etc. Também detalha os riscos de parar incorretamente o MongoDB (como corrupção de dados) e fala sobre os diferentes sinais de interrupção.

Além disso, se você instalou o MongoDB usando um gerenciador de pacotes para Ubuntu ou Debian , poderá parar o mongodb (atualmente mongod no ubuntu) da seguinte maneira:

  • Subir na vida: sudo service mongod stop

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

Ou no Mac OS X

Ou nos sistemas baseados na Red Hat :

  • service mongod stop

Ou no Windows, se você instalou como um serviço chamado MongoDB:

  • net stop MongoDB

E se não estiver instalado como um serviço (a partir do Windows 7+), você poderá executar:

  • taskkill /f /im mongod.exe

Para saber mais sobre os problemas de um desligamento impuro, como evitar esse cenário e o que fazer no caso de um desligamento impuro, consulte: Recuperar dados após um desligamento inesperado .


5
Acredito que a ordem de serviço seja sudo service mongodb [start|stop|restart|status]. sudo service stop mongodbresulta em: paragem: serviço não reconhecido
jacob

2
@ Jacob - Acabamos de tentar isso no ubuntu, você está certo, eu editei a resposta.
Andrew M

5
Para o Mac, você também pode fazer o 'killall mongod'. Dessa forma, você não precisa conhecer o PID.
Jon M

2
Ou no Mac: 'ps -ax | grep mongod 'e, em seguida, mate o número do processo #
Bryan Grace

1
No novo Ubuntu 18.04, eu sou capaz de pará-lo usando> sudo mongod serviço parada ... não "mongodb"
Naseef Ummer

101

Se você quiser literalmente uma linha equivalente aos comandos da sua pergunta original, você pode usar o alias:

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

A resposta de Mark sobre como iniciar e parar o MongoDB por meio de serviços é a abordagem administrativa mais típica (e recomendada).


3
Ótima resposta. Ao configurar várias instâncias na máquina de desenvolvimento (tentando a replicação definida antes da implantação), é útil ter um .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 depois o 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 ...
desenvolvedor Marius Žilėnas

2
No Windows, onde é instalado como um serviço, eu achei que net stop MongoDBnão era confiável, então eu usei algo semelhante: mongo admin --eval "db.shutdownServer()". Felicidades!
NateJ

1
@Stennie Quando eu uso o 'net stop MongoDB' em janelas ele está mostrando "Erro de sistema 1067 ocorreu"
tej charan

48

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

Mais informações em official: http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/


Adoro usar dessa maneira, ele funciona sem o dbpath também, faz sentido se você tiver apenas uma instância em execução.
Radtek 27/05

2
parece que não está funcionando para versões mais recentes, da 2.4.xx à mais recente.
Alexserver #

Esta é a única resposta que eu vi que realmente funcionou.
David Betz 01/02

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

Existe um comportamento definido para isso, se for executado no primário de um conjunto de réplicas? Parece se comportar como o db.shutdownServer({force:1,timeoutSecs:0})que inibiria a liberação dos dados restantes para os secundários. Você pode nem sempre querer isso.
Daniel F

30

Se o servidor estiver executando como o processo em primeiro plano em um terminal, isso pode ser feito pressionando

Ctrl-C

Outra maneira de desligar corretamente um servidor em execução é usar o comando shutdown,

> use admin
> db.shutdownServer();

Caso contrário, um comando como kill pode ser usado para enviar o sinal. Se o mongod tiver 10014 como PID, o comando será

kill -2 10014

3
Usar kill não é uma boa ideia, isso pode levar a um banco de dados quebrado, que precisa de um reparo para reiniciar. "Nunca use kill -9 (isto é, SIGKILL) para finalizar uma instância mongod." Documentos: docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…
Jens A. Koch

7
@ JensA.Koch Ya, Nanhe não estava dizendo a ninguém para usar um sinal de -9, então .. dizer "usar matar não é uma boa idéia" simplesmente não é preciso. Somente o encerramento instantâneo é inseguro - uma morte normal é perfeitamente segura e a documentação que você vinculou a advoga.
BT

18

Eu segui a documentação oficial do MongoDB para parar com os sinais. Um dos seguintes comandos pode ser usado (o PID representa Process IDo mongodprocesso):

kill PID

que envia o sinal 15 (SIGTERM), ou

kill -2 PID

que envia o sinal 2 (SIGINT).

Aviso da documentação do MongoDB :
Nunca use kill -9(por exemplo, SIGKILL) para finalizar uma mongodinstância.

Se você possui mais de uma instância em execução ou não se importa com o PID, pode pkillenviar o sinal para todos os mongodprocessos em execução :

pkill mongod

ou

pkill -2 mongod

ou, muito mais seguro, apenas para os processos que pertencem a você:

pkill -U $USER mongod

ou

pkill -2 -U $USER mongod


Nota do PS : Eu usei essa opção porque mongod --shutdown, embora mencionado na documentação atual do MongoDB , curiosamente não funciona na minha máquina (macOS, mongodb v3.4.10, instalado com homebrew):
Error parsing command line: unrecognised option '--shutdown'

PPS
(específico do macOS) Antes que alguém se perguntasse: não, não consegui parar com o comando
brew services stop mongodb
porque não o iniciei
brew services start mongodb.
Eu comecei mongodcom uma linha de comando personalizada :-)


Ótima resposta, que confirmou que o MongoDB pode ser finalizado normalmente usando o sinal SIGTERM. É importante se você executar o MongoDB em um Docker - docs.docker.com/compose/compose-file/#stop_grace_period . Observe também que o CMD ["mongod", "option", "option"] precisa ser usado para garantir que o MongoDB receba o PID 1 e o sinal enviado pelo Docker alcançará seu DB.
precisa saber é

9

Usar mongod --shutdown

De acordo com o documento oficial: manage-mongodb-process /

: D


Isto é o que eu estava procurando. Muito obrigado.
Gaurav Sharma

Falha ao interromper o processo: errno: 1 Operação não permitida.
Htm11h


Isso que só funcionou para mim. Eu não tenho o mongod como serviço e o comando start estava mostrando erro. Uma instância do mongod já está em execução. Muito obrigado, cara!
Sanjeet A

8

Meu caso especial é:

iniciar o mongod anteriormente por:

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

agora quer parar mongod .

e consulte o documento oficial Stop mongod Processes , tentou:

(1) shutdownServermas falhou:

> 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) --shutdownainda falhou:

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

(3) comando de início anterior adicionando --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) use servicepara parar:

service mongod stop

e

service mongod status

show esperado, Active: inactive (dead)mas mongodna verdade ainda está em execução, pois pode ver o processo do ps:

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

e finalmente , realmente pare o mongod:

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

até agora, causa raiz: ainda desconhecida ...

A solução acima da esperança é útil para o seu.


6

crie um arquivo chamado mongostop.bat

salve o código a seguir

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

execute o arquivo mongostop.bat e você parou com êxito o mongo


4

Um liners para iniciar ou parar o serviço mongodb usando a linha de comando;

  1. Para iniciar o serviço, use: NET START MONGODB
  2. Para interromper o serviço, use: NET STOP MONGODB

Eu mesmo uso isso, funciona.


Eu entendo isso usando esses comandos no Windows: c: \ mongodb \ bin> NET START MONGODB O nome do serviço é inválido. Mais ajuda está disponível, digitando NET HELPMSG 2185. c: \ mongodb \ bin> NET STOP MONGODB O nome do serviço é inválido. Mais ajuda está disponível, digitando NET HELPMSG 2185.

No Windows, você primeiro precisa instalar o mongodb como um serviço usando a opção --install. Os comandos que você pode usar um comando semelhante ao seguinte para instalá-lo como um serviço. 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 O comando acima deve ser executado com privilégios de administrador. Depois disso, você poderá usar os comandos net start e net stop fornecidos por Hugo.
Ed Ost

3

Dos comandos fornecidos, acho que você está no Linux.

Inicie o MongoDB:

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

Verifique o status:

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

Pare o MongoDB:

$ sudo service mongod stop
mongod stop/waiting 

2

Com base na resposta de stennie:

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

Eu descobri que o mongo estava tentando se reconectar ao banco de dados após o servidor desligar, o que causaria um atraso e mensagens de erro. Adicionar quit () após o desligamento acelera e reduz as mensagens, mas ainda existe uma.

Também quero adicionar contexto - estou iniciando e parando o mongod como parte de casos de teste para outro código; portanto, o registro como um serviço não se encaixa no caso de uso. Espero terminar com algo que roda em todas as plataformas (testado no Windows agora). Estou usando o mongod 3.6.9


1

Eu simplesmente fiz:

quit();

Observe que estou usando o mongo 3.0.

Mongo


Se você estivesse executando em uma VM, esse comando apenas interromperia a VM.
Htm11h

1

na janela do terminal no seu mac, pressione control + c


Alguém votou negativamente nisso. É, de fato, uma das maneiras de parar o mongo de acordo com a documentação do mongo. Na maioria das situações, isso não funcionará, pois o mongo deve estar em execução naquele terminal e não em segundo plano ou como um demônio, mas "às vezes" essa solução funcionará. Quando downvoting é bom para explicar por que
TanisDLJ

1

Usando homebrew (maneira recomendada):

Para iniciar:

brew services start mongodb-community

Parar:

brew services stop mongodb-community


0

Eu uso esse script de inicialização no 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
Então você mata o mongoDB diretamente, certo? Eu sou iniciante no MongoDB, existe alguma dor para matá-lo? Eu sei que para SQLServer ou Oracle, eles encontrarão problemas se nós apenas os matarmos.
XiaoYao

matar é -9 mas -15 u envia SINAL.
Boris Ivanov


0

Aproveite o Gerenciador de Tarefas fornecido pelo seu sistema operacional para obter uma solução rápida e fácil. Abaixo está o screengrab do / para Windows 10. Clique com o botão direito do mouse no processo realçado e selecione Parar . Selecione iniciar , se já estiver parado.

insira a descrição da imagem aqui

Observação: internamente, os comandos estão fazendo a mesma coisa que você deve fazer manualmente, usando uma GUI (Gerenciador de tarefas), fornecida pelo Windows / seu sistema operacional. No entanto, essa abordagem deve ser usada para fins de estudo / prática e você não será bloqueado por isso.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.