MongoDB 通过 Brew Services "undefined method `plist_startup'"

回答 6 浏览 1336 2023-12-14

当我运行 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
Sparrow 提问于2023-12-14
遇到此错误时,您运行的是哪个版本的 Homebrew?TylerH 2023-12-20
另请考虑协调“我没有安装任何主要更新或对我的环境进行任何修改。”和“我可能在某些时候运行过、也可能没有运行过brew upgrade”的语句。 ”现在你已经有时间调查这是否发生了,因为这是两个相互矛盾的陈述。TylerH 2023-12-20
6 个回答
#1楼
得票数 8

这个肮脏的黑客对我有用:

编辑这个文件:

/opt/homebrew/Library/Taps/homebrew/homebrew-services/lib/service/formula_wrapper.rb

更改行:

@service_startup ||= formula.plist_startup.present?

@service_startup ||= formula.plist_name.present?

madhusoodhanan nottiyath 提问于2023-12-19
对我也有用,但我认为这会在其他应用程序中产生问题。PriyankMotivaras 2023-12-19
此内容是否引用自其他位置?如果有,来源是什么?如果不是,为什么要使用引号格式?TylerH 2023-12-20
另外,这有什么作用?请解释你的答案。TylerH 2023-12-20
#2楼 已采纳
得票数 2

最近Homebrew更新到4.2,改变了它启动服务的方式。它需要 mongodb 公式显式定义服务块,即使只是指向服务文件。

该修复已合并在 https://github.com/mongodb/homebrew-brew/commit /2d0bfe19214d1f5071decd238b29306a6e82fff2

dmoody256 提问于2023-12-20
感谢您调查此事,好先生!我已经看到 brew upgrade 流程带来的变化。Sparrow 2023-12-20
#3楼
得票数 0

我最近遇到了这个问题,并浏览了上面的整个列表。这对我和我的 Mac 来说都是有效的。我去 Finder 找到了 MongoDB。当我单击该应用程序时,它表明我的计算机认为它是恶意的。我必须右键单击并手动允许它打开。然后当我回到 Compass 时,我就能够连接了。

Pamela 提问于2023-12-19
感谢您的意见 - 如果我当前的解决方案失败,我可能会尝试。 FWIW - 我们在这里看到的问题是通过代码和脚本利用 MongoDB 服务本身,而不是 GUI 编辑器(MongoDB Compass)。Sparrow 2023-12-20
#4楼
得票数 0

启动脚本已更改

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
Sparrow 提问于2023-12-14
Sparrow 修改于2023-12-19
无论我使用什么名称来启动服务,我都会遇到相同的错误,还有其他想法吗?fixmycode 2023-12-18
是的,我也运行了官方文档中的命令,也通过卸载重新尝试了它,步骤在这里,但仍然没有运气。matiss.andersons 2023-12-18
我可能会投反对票的临时修复..我不建议这样做,但您可以注释掉 /opt/homebrew/Library/Taps/homebrew/homebrew-services/lib/service/formula_wrapper.rb 其中行是:@service_startup ||= Formula.plist_startup.present?matiss.andersons 2023-12-18
#5楼
得票数 0

在 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 & 这将在每次打开终端时运行命令来手动启动数据库。最后的&是为了确保它在后台运行。

这似乎有效,但它可能会很烦人,就像您想使用指南针一样,您需要打开终端来启动数据库。不过,在开发人员推出更新之前,我认为这是一种解决方法。

V.Villacis 提问于2023-12-20
每次我打开新的终端窗口时,这不会运行 mongo 吗?不管怎样,这里的目标不是在像 Compass 这样的 GUI 中使用 MongoDB。是将其用作服务(通过代码)。也许您可以看看制作一个简单的函数来启动/停止服务,就像我在其他帖子中展示的那样。无需每次打开新的终端窗口时都启动(特别是如果使用多个终端窗口,就像我通常做的那样)。Sparrow 2023-12-20
#6楼
得票数 0

另外一个选择

目前,这已被证明是有用的。我想删除 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

˙\(ツ)

Sparrow 提问于2023-12-20