Як зупинити DB DB в одній команді


159

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

./монг

Але щоб зупинити DB DB, мені потрібно спершу запустити відкриту оболонку mongo, а потім ввести дві команди:

$ ./mongo

використовувати адмін

db.shutdownServer ()

Тому я не знаю, як зупинити DB DB в одному рядку. Будь-яка допомога?

Відповіді:


226

Запуск та зупинка програми MongoDB розглянута у посібнику з MongoDB. Він пояснює різні варіанти зупинки MongoDB через оболонку, кліп, драйвери тощо. Він також детально описує ризики неправильної зупинки 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результати в: зупинка: невизнаний сервіс
jacob

2
@Jacob - Ми просто спробували це на ubuntu, ти маєш рацію, я відредагував відповідь.
Андрій М

5
Для Mac, ви також можете просто зробити "killall mongod". Таким чином, вам не потрібно знати PID.
Джон М

2
Або на Mac: 'ps -ax | grep mongod ', потім вбийте номер процесу
Брайан Грейс

1
У новій Ubuntu 18.04 я можу зупинити це за допомогою> служби судо mongod stop ... не "mongodb"
Naseef Ummer

101

Якщо ви буквально хочете, щоб один рядок, еквівалентний командам у вашому початковому запитанні, ви можете мати псевдонім:

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

Відповідь Марка про запуск та зупинку MongoDB через сервіси - більш типовий (і рекомендований) адміністративний підхід.


3
Чудова відповідь. Під час налаштування декількох екземплярів на машині розвитку (намагається встановити реплікацію перед розгортанням), це допомагає мати .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 ... а потім мати 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 ...
Розробник Marius Žilėnas

2
В операційній системі Windows , де він встановлений як сервіс, я виявив , що net stop MongoDBні надійним, так що я використовував що - щось подібне: mongo admin --eval "db.shutdownServer()". Ура!
NateJ

1
@Stennie Коли я використовую 'net stop MongoDB' у Windows, він показує "Виникла системна помилка 1067"
charan tej

48

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

Більше інформації на офіційному веб-сайті: http://docs.mongodb.org/manual/tutorial/manage-mongodb-process/


Я люблю використовувати цей спосіб, він працює і без dbpath, має сенс, якщо у вас працює лише один екземпляр.
radtek

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

Ще один спосіб чистого вимкнення працюючого сервера - використання команди відключення,

> use admin
> db.shutdownServer();

В іншому випадку для передачі сигналу може бути використана така команда, як kill. Якщо mongod має 10014 як свій PID, команда буде

kill -2 10014

3
Використання kill не є хорошою ідеєю, це може призвести до злому БД, який потребує відновлення для перезавантаження. "Ніколи не використовуйте kill -9 (тобто SIGKILL), щоб припинити екземпляр mongod." Документи: docs.mongodb.org/manual/tutorial/manage-mongodb-process/…
Єнс А. Кох

7
@ JensA.Koch Я, Нанье нікому не казала використовувати сигнал -9, тому .. сказати "використовувати убивство не є хорошою ідеєю" просто не є точним. Небезпечне лише миттєве припинення - звичайне вбивство є абсолютно безпечним, а документація, яку ви пов’язали, захищає його.
BT

18

Я дотримувався офіційної документації MongoDB для зупинки з сигналами. Можна використовувати одну з наступних команд (PID являє 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зі спеціального командного рядка :-)


Чудова відповідь, яка підтвердила, що 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-process /

: D


Це те, що я шукав. Дуже дякую.
Gaurav Sharma

Не вдалося вбити процес: errno: 1 Операція не дозволена.
htm11h


Це те, що тільки працювало на мене. У мене немає mongod як служби, і команда start показувала помилку - це екземпляр mongod вже запущений. Дякую тони, чоловіче!
Sanjeet A

8

Мій особливий випадок:

попередньо запустити mongod:

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

тепер, хочу зупинитися mongod.

і зверніться до офіційного doc Stop mongod Proces , спробував:

(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

і нарешті , справді зупиніть монгода:

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

до цих пір, першопричина: досі невідомо ...

сподіваємось, що вище рішення буде корисним для вашого.


6

створити файл під назвою mongostop.bat

збережіть у ній наступний код

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

запустіть файл mongostop.bat і успішно його зупинили


4

Один вкладиш для запуску або зупинки служби mongodb за допомогою командного рядка;

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

Я цим самим користуюся, він спрацьовує.


Я отримую це за допомогою цих команд у Windows: c: \ mongodb \ bin> NET START MONGODB Ім'я послуги недійсне. Додаткову допомогу можна отримати, ввівши NET HELPMSG 2185. c: \ mongodb \ bin> NET STOP MONGODB Назва служби недійсна. Додаткову допомогу можна отримати, набравши NET HELPMSG 2185.

У Windows спочатку потрібно встановити mongodb як службу за допомогою параметра --install. Команди ви можете використовувати команду, аналогічну наведеній нижче, щоб встановити її як службу. mongod --встановити --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 Команда вище повинна виконуватися з правами адміністратора. Після цього ви зможете скористатися командами чистого запуску та чистої зупинки, наданими 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 

2

Спираючись на відповідь зі стенні:

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

Я виявив, що монго намагався знову підключитися до db після відключення сервера, що призведе до затримки та повідомлень про помилки. Додавання quit () після відключення прискорює його та зменшує повідомлення, але все одно є.

Я також хочу додати контекст - я запускаю і зупиняю mongod як частину тестових випадків для іншого коду, тому реєстрація як послуга не відповідає випадку використання. Я сподіваюся закінчити щось, що працює на всіх платформах (це перевірено зараз у Windows). Я використовую mongod 3.6.9



1

у вікні терміналу вашого комп'ютера натисніть клавішу управління + c


Хтось заборонив цьому. Насправді це один із способів зупинити монго згідно документації на монго. У більшості ситуацій це не спрацює, оскільки монго має працювати в цьому терміналі, а не у фоновому режимі чи як демон, але "іноді" це рішення спрацює. Під час зволікання приємно пояснити, чому
TanisDLJ

1

Використання домашньої кави (рекомендований спосіб):

Починати:

brew services start mongodb-community

Зупинитися:

brew services stop mongodb-community


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 u відправити СИГНАЛ.
Борис Іванов


0

Будь ласка, скористайтеся диспетчером завдань, наданим вашою ОС для швидкого і простого рішення. Нижче наводиться екран екрану з / для Windows 10. Клацніть правою кнопкою миші на виділеному процесі та виберіть зупинку . Виберіть початок , якщо його вже зупинено.

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

Зверніть увагу: Внутрішньо команди виконують те саме, що вам потрібно зробити вручну за допомогою GUI (диспетчера завдань), наданого Windows / вашою ОС. Хоча цей підхід використовувати для навчальних / практичних цілей, щоб почати роботу, і ви не будете заблоковані через це.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.