MongoDB 通过 Brew Services "undefined method `plist_startup'"
当我运行 MongoDB 时,我通常手动启动它(即它不是我的登录启动项的一部分),并且我擅长在关闭之前停止服务。
我最近重新启动了笔记本电脑,并在运行时收到错误:
brew services run mongodb/brew/mongodb-community
错误消息如下:
Error: undefined method `plist_startup' for #<Formula mongodb-community (stable) /usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew/Formula/mongodb-community.rb>
我不太确定发生了什么事。我尚未安装任何重大更新或对我的环境进行任何修改。
我尝试过的
我完全卸载了 MongoDB,然后再次安装:
# Uninstall each component of mongodb-community...
brew uninstall mongodb/brew/mongodb-community
brew uninstall mongodb/brew/mongodb-database-tools
brew uninstall mongosh
# Reinstall all of the above...
brew install mongodb/brew/mongodb-community
当前安装
mongod --version
db version v7.0.2
Build Info: {
"version": "7.0.2",
"gitVersion": "02b3c655e1302209ef046da6ba3ef6749dd0b62a",
"modules": [],
"allocator": "system",
"environment": {
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
可能是Homebrew...?
老实说,有时在深夜,我会处于自动驾驶状态。我可能在某个时刻运行过brew upgrade
,也可能没有运行过。我会调查一下是否发生过这种情况。与此同时,当我在 Homebrew 中获取 MongoDB 的日志时,我什至没有看到会对我产生影响的提交:
brew log mongodb/brew/mongodb-community
# Yields...
commit f33a59b6642f6a9f47f84b390dd71c386998cce6
Author: Zack Winter <[email protected]>
Date: Wed Oct 4 23:24:26 2023 +0000
Update paths with mr script
commit 7f3db6dbe9231300cc61645c68686a970b575f1f
Author: Zack Winter <[email protected]>
Date: Tue Oct 3 20:00:06 2023 +0000
SERVER-80537 update formulas for 7.0.1 release
commit 5055c34131148681885ea2241abccfc603596295
Author: Alexander Neben <[email protected]>
Date: Fri Aug 18 10:54:02 2023 -0700
这个肮脏的黑客对我有用:
编辑这个文件:
/opt/homebrew/Library/Taps/homebrew/homebrew-services/lib/service/formula_wrapper.rb
更改行:
@service_startup ||= formula.plist_startup.present?
到
@service_startup ||= formula.plist_name.present?
最近Homebrew更新到4.2,改变了它启动服务的方式。它需要 mongodb 公式显式定义服务块,即使只是指向服务文件。
该修复已合并在 https://github.com/mongodb/homebrew-brew/commit /2d0bfe19214d1f5071decd238b29306a6e82fff2
brew upgrade
流程带来的变化。
- Sparrow 2023-12-20
我最近遇到了这个问题,并浏览了上面的整个列表。这对我和我的 Mac 来说都是有效的。我去 Finder 找到了 MongoDB。当我单击该应用程序时,它表明我的计算机认为它是恶意的。我必须右键单击并手动允许它打开。然后当我回到 Compass 时,我就能够连接了。
启动脚本已更改
FAIL...see [UPDATE] at the bottom
我不确定如何或为什么,但启动脚本似乎必须更改。以下是我为让 MongoDB 恢复并再次运行而采取的步骤,不过我建议先跳到尝试启动 MongoDB 的替代方法。
重新安装MongoDB
我首先尝试通过 Homebrew 强制重新安装 MongoDB。当然,我的努力没有任何效果:
brew reinstall mongodb/brew/mongodb-community
卸载Homebrew
这很烦人,因为它基本上会断开自己与任何已安装软件的连接。如果你想像往常一样快速完成更新,就必须重新安装所有内容。其实很简单,列一个清单,然后批量安装就可以了:
brew leaves
但是,请小心:这并不包括您所有的桶。我忘记列清单并在这个假期检查了两次。如果您想要一个包装精美的 Homebrew,请务必运行以下命令:
brew list --cask #add the "-1" to the end if you want a vertical list.
重新安装旧版本的 Homebrew
我回去找到了 Homebrew-4.1.23.pkg
的安装程序包,当我无法弄清楚如何从脚本安装以前的版本时,我只是通过 GUI 安装了。
不幸的是,在运行任何类型的 brew install ...
命令之前,我忘记设置此变量:
export HOMEBREW_NO_AUTO_UPDATE=1;
....soooooo,是的。一旦我运行任何brew命令,它就会立即将我升级回我开始认为存在问题的位置。 您是否很高兴跳到最后而不是按照这些步骤操作?
替代方法
FWIW - 当需要重新安装 MongoDB 时,我遵循了与以前不同的路径; 与我为系统设置编写的脚本不同。我使用了 MongoDB 文档:
brew install [email protected]
更改 MongoDB 启动脚本
在我的配置文件脚本中,我有一些用于管理诸如 MongoDB 的启动/停止之类的功能。例如,我的 run
MongoDB 脚本如下所示:
function mongo-run {
pid=$(ps -A | grep '[mon]god' | awk '{printf "%d", $1}');
if [[ -z $pid ]];then
brew services run mongodb/brew/mongodb-community;
else
printf "
${txtblu}Mongo is already running with process ID ${bldblu}$pid${txtrst}\n";
fi
}
...我所做的就是改变成这样:
function mongo-run {
pid=$(ps -A | grep '[mon]god' | awk '{printf "%d", $1}');
if [[ -z $pid ]];then
brew services run mongodb-community;
else
printf "
${txtblu}Mongo is already running with process ID ${bldblu}$pid${txtrst}\n";
fi
}
以防你错过了它:
# This...
brew services run mongodb/brew/mongodb-community;
# changed to this...
brew services run mongodb-community;
Pretty ridiculous, right?
那好吧。现在一切又恢复正常了。
更新
我不知道我到底做了什么,但我又遇到了原来的错误消息。
奇怪的是,在我运行 Homebrew 命令来删除和清理 MongoDB 相关内容后,我运行了 brew services run mongodb-community
命令并收到了 SAME 错误消息。 ...好像在我运行卸载和清理命令后 .rb
脚本没有被删除。
我最终再次完全重新安装了它(MongoDB,即 - 不是 Homebrew),但仍然看到错误。
- 我还确保我的 Mac 上没有安装其他 Ruby,只有默认的
v2.6
。
在 mac m1 上,我所做的修复是添加命令来手动启动数据库。使用以下命令mongod --config /opt/homebrew/etc/mongod.conf
自动运行
步骤1:找到你的mongod.conf在哪里,它应该在etc文件夹中,但取决于你的芯片。因此,请执行brew --prefix
进行检查。我在 m1 中,所以我的在上述中,但你的可能会说/usr/local
,在这种情况下请检查/usr/local/etc
。
步骤 2. 打开您的.zshrc
文件。这应该位于您的主目录中。如果您不在 zsh 上,请检查 .bashrc
文件。
步骤 3. 在 rc 文件末尾添加。 mongod --config /opt/homebrew/etc/mongod.conf &
这将在每次打开终端时运行命令来手动启动数据库。最后的&
是为了确保它在后台运行。
这似乎有效,但它可能会很烦人,就像您想使用指南针一样,您需要打开终端来启动数据库。不过,在开发人员推出更新之前,我认为这是一种解决方法。
另外一个选择
目前,这已被证明是有用的。我想删除 root
作为服务的执行用户。我不确定它对其他人有多大用处,但是(使用任何程序员都能说出的最糟糕的短语)“它在我的机器上运行:”
# Be sure to insert your user name in the next line...
sudo brew services run mongodb-community --sudo-service-user <your.user.name>
brew services ls
sudo brew services stop mongodb-community
brew services start mongodb-community
分解
运行第一个命令后,我看到该服务下面有我的用户名,即使它没有运行。在之前的尝试中,这总是说root
:
brew services ls
# Yields...
Name Status User File
docker-machine none
mongodb-community started <your.user.name>
出于迷信,我跑了第三行,希望需要清理的东西得到清理。
当我运行最后一个命令start
服务并重新启动我的机器时,一切正常。我今天重新启动了几次,到目前为止一切顺利。
brew services ls
# After rebooting this yields...
Name Status User File
docker-machine none
mongodb-community started <your.user.name> ~/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist
˙\(ツ)/˙