ChatGPT解决这个技术问题 Extra ChatGPT

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

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

./mongod

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

$ ./mongo 使用管理员 db.shutdownServer()

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


E
Edi

Starting and Stopping MongoDB 包含在 MongoDB 手册中。它解释了通过 shell、cli、驱动程序等停止 MongoDB 的各种选项。它还详细说明了错误停止 MongoDB 的风险(例如数据损坏)并讨论了不同的终止信号。

此外,如果您使用 UbuntuDebian 的包管理器安装了 MongoDB,那么您可以停止 mongodb(当前是 ubuntu 中的 mongod),如下所示:

新贵:sudo service mongod stop

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

或在 Mac OS X

使用 $ top 查找 mongod 进程的 PID

通过 $ kill 杀死进程(Mongo 文档对此有更多信息)

或者在基于 Red Hat 的系统上:

服务 mongod 停止

或者如果您已安装为名为 MongoDB 的服务,则在 Windows 上:

净停止 MongoDB

如果没有作为服务安装(从 Windows 7+ 开始),您可以运行:

taskkill /f /im mongod.exe

要详细了解不正常关机的问题、如何最好地避免这种情况以及在不正常关机的情况下该怎么做,请参阅:Recover Data after an Unexpected Shutdown


我相信服务订单是 sudo service mongodb [start|stop|restart|status]sudo service stop mongodb 导致:停止:无法识别的服务
@Jacob - 我们刚刚在 ubuntu 上试过这个,你是对的,我已经编辑了答案。
对于 Mac,您也可以只执行“killall mongod”。这样,您就不需要知道 PID。
或者在 Mac 上:'ps -ax | grep mongod',然后杀死进程号
在新的 Ubuntu 18.04 中,我可以使用 > sudo service mongod stop ... not "mongodb" 停止它
S
Stennie

如果您确实想要与原始问题中的命令等效的一行,则可以使用别名:

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

Mark 关于通过服务启动和停止 MongoDB 的回答是更典型(也是推荐的)管理方法。


很好的答案。在开发机器上设置多个实例时(在部署之前尝试复制集),有一个 .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 ... 会有所帮助
在作为服务安装的 Windows 上,我发现 net stop MongoDB 不可靠,所以我使用了类似的东西: mongo admin --eval "db.shutdownServer()" 。干杯!
@Stennie 当我在 Windows 上使用“net stop MongoDB”时,它显示“发生系统错误 1067”
f
francoisrv

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

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


我喜欢使用这种方式,它也可以在没有 dbpath 的情况下工作,如果你只运行一个实例就有意义。
似乎它不适用于从 2.4.xx 到最新的较新版本。
这是我见过的唯一有效的答案。
macOS 10.12,mongod v3.4.10Error parsing command line: unrecognised option '--shutdown':-(
如果它在副本集的主节点上运行,是否有定义的行为?它的行为似乎类似于 db.shutdownServer({force:1,timeoutSecs:0}),它会禁止将剩余数据刷新到辅助节点。你可能并不总是想要那个。
N
Nanhe Kumar

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

Ctrl-C

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

> use admin
> db.shutdownServer();

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

kill -2 10014

使用 kill 不是一个好主意,这可能会导致数据库损坏,需要修复才能重新启动。 “永远不要使用 kill -9(即 SIGKILL)来终止 mongod 实例。”文档:docs.mongodb.org/manual/tutorial/manage-mongodb-processes/…
@JensA.Koch Ya,南河没有告诉任何人使用 -9 信号,所以.. 说“使用 kill 不是一个好主意”根本不准确。只有立即终止是不安全的 - 正常杀死是完全安全的,并且您链接到的文档支持它。
t
t0r0X

我按照官方的 MongoDB documentation 停止信号。可以使用以下命令之一(PID 表示 mongod 进程的 Process ID):

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

注意:如果数据库以其他用户身份运行,但您具有管理权限,则您必须使用 sudo 调用上述命令才能运行它们。例如:

sudo pkill mongod
sudo pkill -2 mongod

附言

注意:我使用信号是因为 mongod --shutdown,虽然在当前的 MongoDB documentation 中提到,但在我的机器上不起作用(macOS,mongodb v3.4.10,与 homebrew 一起安装):

Error parsing command line: unrecognised option '--shutdown'

2022-05-10 更新

同时选项 --shutdown 在文档中标记为“Supported on Linux only”。

聚苯乙烯

(特定于 macOS)在任何人怀疑之前:不,我无法用命令停止它

brew services stop mongodb

因为我没有开始

brew services start mongodb

我已经开始使用自定义命令行 mongod :-)


很好的答案,这证实了 MongoDB 可以使用 SIGTERM 信号优雅地终止。如果在 Docker - docs.docker.com/compose/compose-file/#stop_grace_period 中运行 MongoDB,这一点很重要。另外请注意,需要使用 CMD ["mongod", "option", "option" ] 来确保 MongoDB 获得 PID 1,然后 Docker 发送的信号将到达您的数据库。
S
Shawn Wang

使用mongod --shutdown

根据官方文档:manage-mongodb-processes/

:D


这就是我一直在寻找的。非常感谢。
无法终止进程:errno:1 不允许操作。
这只对我有用。我没有 mongod 作为服务,启动命令显示错误是 mongod 的实例已经在运行。非常感谢,伙计!
A
Adeojo Emmanuel IMM

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

将以下代码保存在其中

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

运行文件 mongostop.bat ,你成功地停止了 mongo


c
crifan

我的特殊情况是:

以前通过以下方式启动 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

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

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


H
Hugo Dozois

一个使用命令行启动或停止 mongodb 服务的衬垫;

启动服务使用:NET START MONGODB 停止服务使用: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 命令。
D
David Fridley

基于 stennie 的回答:

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

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

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


我真的很喜欢这个版本。我不知道服务/可执行文件或 pid .. 或者它们都没有返回预期的响应。这对我有帮助。
r
ranafeb14

根据给定的命令,我认为您使用的是 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 

n
nitin.agam

使用自制软件(推荐方式):

开始:

brew services start mongodb-community

停止:

brew services stop mongodb-community


F
Felipe Alarcon

我只是做了:

quit();

请注意我使用的是 mongo 3.0。

Mongo


如果您在 VM 中运行,则该命令只会停止 VM。
S
Shyamal

在 Mac 的终端窗口中,按 control+c


有人对此表示反对。事实上,根据 mongo 文档,它是停止 mongo 的方法之一。在大多数情况下,这不起作用,因为 mongo 应该在该终端中运行,而不是在后台或作为恶魔运行,但“有时”这个解决方案会起作用。投票时很高兴解释为什么
B
Boris Ivanov

我在 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

所以你直接杀了mongoDB,对吧?我是MongoDB的初学者,杀死它有什么伤害吗?我知道对于 SQLServer 或 Oracle,如果我们直接杀死它们,它们就会遇到问题。
杀死是-9但-15你发送信号。
k
kenorb

视窗

在 PowerShell 中,它是:Stop-Service MongoDB

然后重新开始:Start-Service MongoDB

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

注意:以上假设为 MongoDB is registered as a service


S
Santhosh John

请利用您的操作系统提供的任务管理器来获得快速简便的解决方案。以下是 Windows 10 的屏幕截图。右键单击突出显示的进程并选择停止。如果已经停止,请选择开始。

https://i.stack.imgur.com/RWS8A.png

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


D
Deepa Rokhade

启动 sudo /etc/init.d/mongodb start

停止 sudo /etc/init.d/mongodb stop


我相信这已经在 accepted answer
C
CodyBugstein

CTRL + C

在 Windows 命令行上