如何在一个命令中停止mongo DB


159

我需要能够在cli上启动/停止MongoDB。开始非常简单:

./mongod

但是要停止mongo DB,我需要先运行open mongo shell,然后键入两个命令:

$ ./蒙古

使用管理员

db.shutdownServer()

所以我不知道如何在一行中停止mongo DB。有什么帮助吗?

Answers:


226

启动和停止MongoDBMongoDB手册中介绍了。它解释了通过外壳,cli,驱动程序等停止MongoDB的各种选项。还详细介绍了错误地停止MongoDB的风险(例如数据损坏),并讨论了不同的终止信号。

另外,如果您已使用UbuntuDebian的软件包管理器安装了MongoDB,则可以按以下方式停止mongodb(当前在ubuntu中为mongod):

  • 暴发户: 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 2013年

2
@Jacob-我们刚刚在ubuntu上尝试过,您是对的,我已经编辑了答案。
Andrew M

5
对于Mac,您也可以执行“ killall mongod”。这样,您无需知道PID。
乔恩M

2
或在Mac上:'ps -ax | grep mongod',然后杀死进程号
Bryan Grace

1
在新的Ubuntu 18.04中,我可以使用> sudo service mongod stop ...而不是“ mongodb”来停止它
Naseef Ummer

101

如果从字面上希望与原始问题中的命令等效的一行,则可以使用别名:

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

Mark关于通过服务启动和停止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 ...
开发马吕斯Žilėnas

2
在将其作为服务安装的Windows上,我发现它net stop MongoDB不可靠,因此我使用了类似的方法:mongo admin --eval "db.shutdownServer()"。干杯!
NateJ

1
@Stennie当我在Windows上使用'net stop MongoDB'时,它显示“发生系统错误1067”
charan tej

48

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

官方的更多信息:http : //docs.mongodb.org/manual/tutorial/manage-mongodb-processes/


我喜欢使用这种方式,即使没有dbpath,它也可以工作,如果只运行一个实例,这是有意义的。
radtek

2
似乎不适用于从2.4.xx到最新版本的较新版本。
alexserver 2014年

这是我见过的唯一有效的答案。
David Betz

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

如果它在副本集的主数据库上运行,是否有为此定义的行为?看起来好像db.shutdownServer({force:1,timeoutSecs:0})会阻止将剩余数据刷新到辅助数据库。您可能并不总是想要那个。
丹尼尔·F

30

如果服务器在终端中作为前台进程运行,则可以通过按

Ctrl-C

彻底关闭正在运行的服务器的另一种方法是使用shutdown命令,

> use admin
> db.shutdownServer();

否则,可以使用诸如kill之类的命令来发送信号。如果mongod的PID为10014,则命令为

kill -2 10014

3
使用kill不是一个好主意,这可能会导致数据库损坏,需要修复后才能重新启动。“切勿使用kill -9(即SIGKILL)来终止mongod实例。” 文件:docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…–
Jens A. Koch

7
@ JensA.Koch Ya,Nanhe没有告诉任何人使用-9信号,因此..说“使用杀手不是一个好主意”根本是不准确的。只有即时终止是不安全的-正常的杀死是绝对安全的,并且您链接到的文档也建议这样做。
BT

18

我遵循了MongoDB的官方文档以停止信号。一个下面的命令,可以使用的(PID表示Process ID的的mongod处理):

kill PID

发送信号15(SIGTERM),或

kill -2 PID

发送信号2(SIGINT)。

来自MongoDB文档的警告:
切勿使用kill -9mongod例如SIGKILL)终止实例。

如果您有多个实例在运行,或者您不关心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)在任何人都想知道之前:不,我无法使用command停止它,
brew services stop mongodb
因为我没有使用来启动它
brew services start mongodb
我从mongod一个自定义命令行开始:-)


很好的答案,证实了可以使用SIGTERM信号正常终止MongoDB。如果在Docker中运行MongoDB非常重要-docs.docker.com/compose/compose-file/#stop_grace_period。另外请注意,需要使用CMD [“ mongod”,“ option”,“ option”]来确保MongoDB获得PID 1,然后Docker发送的信号将到达您的DB。
laimison


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

直到现在,根本原因:仍然未知...

希望以上解决方案对您有用。


6

创建一个名为mongostop.bat的文件

将以下代码保存在其中

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

运行文件mongostop.bat,您就成功停止了mongo


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上,您首先必须使用--install选项将mongodb作为服务安装。您可以使用类似于以下命令的命令将其安装为服务。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上面的命令必须以管理员权限运行。完成之后,您可以使用Hugo提供的net start和net stop命令。
Ed Ost

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

基于stennie的答案:

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

我发现在服务器关闭后mongo试图重新连接到db,这会导致延迟和错误消息。关闭后添加quit()可以加快速度并减少消息,但是仍然有一个。

我还想添加上下文-我正在启动和停止mongod作为其他代码的测试用例的一部分,因此注册为服务不适合用例。我希望最终能够在所有平台上运行(目前已在Windows中进行测试)。我正在使用mongod 3.6.9



1

在Mac的终端窗口中,按Ctrl + C


有人对此表示反对。实际上,这是根据mongo文档停止mongo的方法之一。在大多数情况下,这是行不通的,因为mongo应该在该终端中运行,而不是在后台或作为恶魔运行,但“有时”此解决方案将行得通。
拒绝投票

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,如果我们杀死它们,它们将遇到问题。
小姚

杀死是-9,但-15 u发送SIGNAL。
鲍里斯·伊凡诺夫

0

视窗

在PowerShell中,它是: Stop-Service MongoDB

然后重新启动它: Start-Service MongoDB

要验证是否已启动,请运行:net start | findstr MongoDB

注意:以上假设MongoDB已注册为service


0

请充分利用操作系统提供的任务管理器,以快速便捷地解决问题。以下是Windows 10的/针对Windows 10的屏幕抓图。右键单击突出显示的进程,然后选择停止。如果已经停止,请选择开始

在此处输入图片说明

请注意:在内部,这些命令执行的操作与使用Windows /您的操作系统提供的GUI(任务管理器)手动执行的操作相同。不过,这种方法可用于学习/练习目的,因此不会因此而受到阻碍。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.