Как остановить монго БД в одной команде

159

Мне нужно иметь возможность запускать / останавливать MongoDB в кли. Начать довольно просто:

./mongod

Но чтобы остановить монго БД, мне нужно сначала запустить оболочку открытого монго, а затем ввести две команды:

$ ./mongo

использовать админ

db.shutdownServer ()

Так что я не знаю, как остановить монго БД в одной строке. Любая помощь?

XiaoYao
источник

Ответы:

226

Запуск и остановка MongoDB описаны в руководстве MongoDB. Он объясняет различные варианты остановки MongoDB через оболочку, cli, драйверы и т. Д. Он также детализирует риски неправильной остановки MongoDB (такие как повреждение данных) и рассказывает о различных сигналах уничтожения.

Кроме того, если вы установили MongoDB с помощью менеджера пакетов для Ubuntu или Debian, вы можете остановить mongodb (в настоящее время mongod в Ubuntu) следующим образом:

  • Выскочка: sudo service mongod stop

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

Или в Mac OS X

Или в системах на базе Red Hat :

  • service mongod stop

Или в Windows, если вы установили в качестве службы с именем MongoDB:

  • net stop MongoDB

И если не установлена ​​как служба (начиная с Windows 7+), вы можете запустить:

  • taskkill /f /im mongod.exe

Чтобы узнать больше о проблемах нечистого выключения, о том, как наилучшим образом избежать такого сценария и что делать в случае нечистого выключения, см. « Восстановление данных после неожиданного выключения» .

Марк Хиллик
источник
5
Я считаю, что заказ на обслуживание есть sudo service mongodb [start|stop|restart|status]. sudo service stop mongodbРезультаты: остановка: неопознанная служба
Джейкоб
2
@Jacob - Мы только что попробовали это на Ubuntu, вы правы, я отредактировал ответ.
Андрей М
5
Для Mac вы также можете просто сделать killall mongod. Таким образом, вам не нужно знать PID.
Джон М
2
Или на Mac: 'ps -ax | grep mongod ', затем убейте номер процесса
Брайан Грейс
1
В новой Ubuntu 18.04 я могу остановить его, используя> sudo service mongod stop ... не "mongodb"
Naseef Ummer
101

Если вам буквально нужна строка, эквивалентная командам в исходном вопросе, вы можете использовать псевдоним:

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

Ответ Марка на запуск и остановку MongoDB через сервисы является более типичным (и рекомендуемым) административным подходом.

Stennie
источник
3
Отличный ответ. При настройке нескольких экземпляров на компьютере разработчика (пробуя набор репликации перед развертыванием) 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 ...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 ...
полезно
2
В операционной системе Windows , где он установлен как сервис, я обнаружил , что net stop MongoDBне был надежным, так что я использовал что - то подобное: mongo admin --eval "db.shutdownServer()". Ура!
NateJ
1
@Stennie Когда я использую «net stop MongoDB» на окнах, он показывает «Произошла системная ошибка 1067»
charan tej
48

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

Более подробная информация на официальном: http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/

francoisrv
источник
Я люблю использовать этот способ, он работает и без dbpath, имеет смысл, если у вас работает только один экземпляр.
Радтек
2
кажется, он не работает для более новых версий, от 2.4.xx до последней.
alexserver
Это единственный ответ, который я видел, который действительно работал.
Дэвид Бец
6
Macos 10,12, mongod v3.4.10: Error parsing command line: unrecognised option '--shutdown':-(
t0r0X
Есть ли определенное поведение для этого, если он запускается на первичном из набора реплик? Кажется, что он ведет себя так, db.shutdownServer({force:1,timeoutSecs:0})что препятствует сбросу оставшихся данных во вторичные. Возможно, вы не всегда этого хотите.
Даниэль Ф
30

Если сервер работает как основной процесс в терминале, это можно сделать, нажав

Ctrl-C

Другой способ аккуратно завершить работу работающего сервера - использовать команду shutdown,

> use admin
> db.shutdownServer();

В противном случае для отправки сигнала может использоваться команда типа kill. Если Mongod имеет 10014 в качестве PID, команда будет

kill -2 10014
Наньхэ Кумар
источник
3
Использование kill не является хорошей идеей, это может привести к поломке БД, которая требует восстановления для перезапуска. «Никогда не используйте kill -9 (то есть SIGKILL), чтобы завершить работу экземпляра mongod». Документы: docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…
Дженс А. Кох,
7
@ JensA.Koch Да, Наньхэ никому не говорил использовать сигнал -9, поэтому сказать: «убить не очень хорошая идея» просто не правильно. Только мгновенное завершение небезопасно - нормальное уничтожение совершенно безопасно, и документация, на которую вы ссылаетесь, поддерживает это.
BT
18

Я следовал официальной документации MongoDB для остановки с сигналами. Один из могут быть использованы следующие команды (ПИД представляет собой Process IDчасть mongodпроцесса):

kill PID

который посылает сигнал 15 (SIGTERM), или

kill -2 PID

который посылает сигнал 2 (SIGINT).

Предупреждение из документации MongoDB :
Никогда не используйте kill -9(например, SIGKILL) для завершения mongodэкземпляра.

Если у вас запущено несколько экземпляров или вам не нужен PID, вы можете использовать pkillдля отправки сигнала всем запущенным mongodпроцессам:

pkill mongod

или

pkill -2 mongod

или, что гораздо безопаснее, только процессам, принадлежащим вам:

pkill -U $USER mongod

или

pkill -2 -U $USER mongod

PS
Примечание: я прибег к этой опции, потому что mongod --shutdown, хотя упомянуто в текущей документации MongoDB , любопытно, что не работает на моей машине (macOS, mongodb v3.4.10, установлен с homebrew):
Error parsing command line: unrecognised option '--shutdown'

PPS
(специфично для macOS) Прежде, чем кто-либо задается вопросом: нет, я не мог остановить это командой,
brew services stop mongodb
потому что я не начал это с
brew services start mongodb.
Я начал mongodс пользовательской командной строки :-)

t0r0X
источник
Отличный ответ, который подтвердил, что MongoDB можно корректно завершить с помощью сигнала SIGTERM. Это важно, если вы запускаете MongoDB в Docker - docs.docker.com/compose/compose-file/#stop_grace_period . Дополнительное примечание: необходимо использовать CMD ["mongod", "option", "option"], чтобы убедиться, что MongoDB получает PID 1, тогда сигнал, отправленный Docker, достигнет вашей БД.
Laimison
9

использование mongod --shutdown

Согласно официальному документу: manage-mongodb-Процессы /

: D

Шон Ван
источник
Это то, что я искал. Большое спасибо.
Гаурав Шарма
Не удалось завершить процесс: errno: 1 Операция не разрешена.
17
Только для Linux: docs.mongodb.com/manual/tutorial/manage-mongodb-processes/…
Кирилл Гусятин
Это то, что работает только для меня. У меня нет mongod в качестве службы, и команда start показала ошибку - экземпляр mongod уже запущен. Большое спасибо, чувак!
Санджит А
8

Мой особый случай:

предварительно начать mongod:

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

сейчас хочу остановиться mongod.

и ссылаюсь на официальный документ Stop Mongod Processes , пробовал:

(1) shutdownServerно не удалось:

> 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) --shutdownвсе еще не удалось:

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

(3) добавление предыдущей команды запуска --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) использовать serviceдля остановки:

service mongod stop

и

service mongod status

покажите ожидаемый, Active: inactive (dead)но на mongodсамом деле все еще работающий, поскольку можете увидеть процесс из ps:

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

и наконец , действительно остановите Mongod:

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

до сих пор первопричина: до сих пор неизвестно ...

Надеюсь, что решение выше полезно для вас.

crifan
источник
6

создайте файл с именем mongostop.bat

сохраните в нем следующий код

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

запустите файл mongostop.bat и вы успешно остановили Монго

Адехо Эммануэль IMM
источник
4

Один лайнер для запуска или остановки сервиса mongodb с помощью командной строки;

  1. Для запуска сервиса используйте: NET START MONGODB
  2. Чтобы остановить использование сервиса: NET STOP MONGODB

Я использую это сам, это работает.

Pirira
источник
Я получаю это при использовании этих команд в Windows: c: \ mongodb \ bin> NET START MONGODB Неверное имя службы. Для получения дополнительной справки введите NET HELPMSG 2185. c: \ mongodb \ bin> NET STOP MONGODB Неверное имя службы. Дополнительную помощь можно получить, набрав NET HELPMSG 2185.
В Windows сначала необходимо установить mongodb как сервис, используя опцию --install. Команды, которые вы можете использовать команду, подобную следующей, чтобы установить его в качестве службы. 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 Команда, указанная выше, должна выполняться с правами администратора. После этого вы можете использовать команды net start и net stop, предоставленные Hugo.
Эд Ост
3

Из приведенных команд я думаю, что вы на Linux.

Запустите MongoDB:

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

Проверьте статус:

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

Стоп MongoDB:

$ sudo service mongod stop
mongod stop/waiting 
ranafeb14
источник
2

Опираясь на ответ от стенние:

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

Я обнаружил, что Монго пытается восстановить соединение с БД после выключения сервера, что может вызвать задержку и сообщения об ошибках. Добавление quit () после выключения ускоряет его и уменьшает количество сообщений, но оно все еще остается.

Я также хочу добавить контекст - я запускаю и останавливаю mongod как часть тестов для другого кода, поэтому регистрация в качестве службы не подходит для варианта использования. Я надеюсь в конечном итоге что-то, что работает на всех платформах (это проверено в Windows прямо сейчас). Я использую Mongod 3.6.9

Дэвид Фридли
источник
1

Я просто сделал:

quit();

Обратите внимание, что я использую монго 3.0.

Монго

Фелипе Аларкон
источник
Если вы работаете в ВМ, эта команда просто остановит ВМ.
17
1

в окне терминала на вашем Mac нажмите control + c

Шьямал
источник
Кто-то отрицал это. На самом деле это один из способов остановить монго в соответствии с документацией монго. В большинстве ситуаций это не будет работать, так как монго должно работать в этом терминале, а не в фоновом режиме или как демон, но «иногда» это решение будет работать. При понижении голосов приятно объяснить почему
TanisDLJ
1

Использование доморощенного (рекомендуемый способ):

Начать:

brew services start mongodb-community

Остановиться:

brew services stop mongodb-community

nitin.agam
источник
0

Я использую этот скрипт запуска в 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
То есть вы просто убиваете mongoDB напрямую, верно? Я новичок в MongoDB, есть ли вред, чтобы убить его? Я знаю, что для SQLServer или Oracle они столкнутся с проблемами, если мы их просто убьем.
XiaoYao
убить -9 но -15 и отправить СИГНАЛ.
Борис Иванов
0

Windows

В PowerShell это: Stop-Service MongoDB

Затем, чтобы начать это снова: Start-Service MongoDB

Чтобы проверить , является ли это началось, запустите: net start | findstr MongoDB.

Примечание. Выше предполагается, что MongoDB зарегистрирован как сервис .

kenorb
источник
0

Пожалуйста, воспользуйтесь диспетчером задач, предоставляемым вашей ОС, для быстрого и простого решения. Ниже приведен скриншот из / для Windows 10. Щелкните правой кнопкой мыши по выделенному процессу и выберите « Остановить» . Выберите начало , если оно уже остановлено.

введите описание изображения здесь

Обратите внимание: внутренне команды делают то же самое, что вы должны делать вручную, используя графический интерфейс (диспетчер задач), предоставляемый Windows / вашей ОС. Тем не менее, этот подход будет использоваться в целях обучения / практики, чтобы начать, и вы не будете заблокированы из-за этого.

nimpossible
источник
-2

CTRL + C

в командной строке Windows

Винсент Т.
источник