在Mac OS X上,停止mongod的正确方法是什么?

108

我正在运行Mongo 1.8.2,并尝试了解如何在Mac上干净地关闭它。

在我们的Ubuntu服务器上,我可以使用Mongo shell干净地关闭Mongo:

> use admin
> db.shutdownServer()

但是在我的Mac上,它不能杀死mongod进程。输出显示它“应该被”关闭,但当我运行ps -ef | grep mongo时,它仍然显示一个活动进程。此外,我仍然可以打开mongo shell并查询我的数据库,就像它从未关闭过。

本地db.shutdownServer()的输出为:

MongoDB shell version: 1.8.2
connecting to: test
> use admin                  
switched to db admin
> db.shutdownServer()
Tue Dec 13 11:44:21 DBClientCursor::init call() failed
Tue Dec 13 11:44:21 query failed : admin.$cmd { shutdown: 1.0 } to: 127.0.0.1
server should be down...
Tue Dec 13 11:44:21 trying reconnect to 127.0.0.1
Tue Dec 13 11:44:21 reconnect 127.0.0.1 failed couldn't connect to server 127.0.0.1
Tue Dec 13 11:44:21 Error: error doing query: unknown shell/collection.js:150

我知道可以直接杀死进程,但我希望更加干净地进行操作。

你是如何启动 mongod 的?只是在 shell 中启动吗?还是使用 launchctl 命令? - dcrosta
你有日志信息吗?可能是MongoDB正在“自动重启”。你可以使用--logappend运行,但全新的日志文件清楚地表明该进程已重新启动。 - Gates VP
9个回答

217

可能是因为launchctl正在管理您的mongod实例。如果要启动和关闭mongod实例,请先卸载它:

launchctl unload -w ~/Library/LaunchAgents/org.mongodb.mongod.plist

然后手动启动 mongod:

mongod -f path/to/mongod.conf --fork

你可以从 ~/Library/LaunchAgents/org.mongodb.mongod.plist 找到 mongod.conf 的位置。

之后,db.shutdownServer() 将能够正常工作。

更新于 Feb 22 2014:

如果你是通过 homebrew 安装的 mongodb,homebrew 实际上有一个方便的 brew services 命令。来显示当前正在运行的服务:

brew services list

要启动 mongodb:

brew services start mongodb-community

如果 mongodb 已经在运行并需要停止:

brew services stop mongodb-community

更新 *

正如评论中 edufinn 指出的那样,brew services 现在可以作为用户定义的命令使用,并且可以通过以下命令进行安装:brew tap gapple/services


24
如果有人感兴趣的话,目前如果您是通过 Homebrew 安装了 MongoDB,您需要执行 launchctl stop homebrew.mxcl.mongodb 命令来停止 MongoDB。 - Tyler Brock
3
截至2014年9月,brew中有一则关于brew services的弃用通知:$ brew services Warning: brew services is unsupported and will be removed soon.意味着这个功能将很快被移除并且不再受支持。 - Pablo Navarro
3
截至2014年12月,brew services已被删除。 $ brew services Error: Unknown command: services 的意思是:运行命令时出错,显示未知命令:services。 - hughes
6
现在,brew services 可以作为用户定义的命令来使用,并且可以通过以下命令进行安装:brew tap gapple/services - edufinn
1
启动了mongodb服务后,我的node服务器无法连接到它。但是如果我从命令行启动mongodb,则可以正常工作。我猜这一定是端口问题...如何在启动服务时设置端口? - pravin
显示剩余4条评论

47
如果您使用homebrew安装了mongodb,则有一种更简单的方法:
使用launchctl列出mongo作业:
launchctl list | grep mongo

停止Mongo作业:
launchctl stop <job label>

对我来说,这就是 launchctl stop homebrew.mxcl.mongodb

启动Mongo作业:

launchctl start <job label>

28

一种简单的方法是获取mongodb的进程ID并将其终止。

请注意,不要使用kill -9 pid来终止mongodb进程,因为这可能会损坏数据库。

因此, 1. 获取mongodb的pid

$ pgrep mongo

您将获得mongo的pid,现在

$ kill

您也可以使用kill -15。


26
如果您已经通过Homebrew安装了MongoDB社区服务器,则可以执行以下操作:

brew services list

这将列出当前的服务,如下所示:

Name              Status  User          Plist
mongodb-community started <your_user_name> /Users/<your_user_name>/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist

redis             stopped

然后您可以通过先停止再重新启动来重启mongodb:

brew services stop mongodb
brew services start mongodb

5

我更喜欢使用 port 命令本身停止 MongoDB 服务器。

sudo port unload mongodb

并重新开始。

sudo port load mongodb

4

3

其他人提供的解决方案曾经对我有用,但现在对我不再有效,以下是其内容。

brew services stop mongodb
brew services start mongodb

brew services list gives

Name              Status  User      Plist
mongodb-community started XXXXXXXXX /Users/XXXXXXXXX/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist

所以我使用了mongodb-community而非mongodb,这对我起了作用。

brew services stop mongodb-community
brew services start mongodb-community

1
这是一个旧问题,但我也在搜索时找到了它。如果您使用brew进行安装,则解决方案实际上应该是这样的:launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist

0
如果服务是通过brew运行的,您可以使用以下命令停止它:
brew services stop mongodb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接