如何使用 RVM 运行用 Ruby 编写的 Munin 插件?

如何使用 RVM 运行用 Ruby 编写的 Munin 插件?

我尝试运行一些用 Ruby 编写的 Munin 插件。我想使用 RVM,因此 Munin 需要知道在哪里找到 Ruby。我尝试将 cron 文件中调用 munin-cron 的行更改为如下内容:

*/5 * * * *     munin bash -c 'source /usr/local/lib/rvm && rvm 1.9.2@munin && /usr/bin/munin-cron'

这会导致 munin-node.log 中出现错误消息,提示

/usr/bin/env: ruby: No such file or directory

当我将插件的 shebang 更改为 Ruby 可执行文件的实际路径时,它可以工作,但应设置 RVM 环境以便 '/usr/bin/env ruby​​' 可以工作。当我以 root 身份执行插件时,它可以工作。

有任何想法吗?

更新 1

由于 Munin 在执行插件时似乎会重置环境,因此我尝试将插件的 shebang 设置为我创建的 RVM 包装器脚本

rvm wrapper 1.9.2@munin munin

现在我在变量名上收到几个“未找到命令”错误,这意味着插件现在由 shell 而不是 Ruby 来解释。

更新 2

复制包装器脚本而不是 rvm 创建的符号链接并添加

source /usr/local/lib/rvm

也没什么帮助。

答案1

我终于搞明白了。忘记我到目前为止所做的一切,试图让它工作。使用以下命令创建包装器脚本后

rvm wrapper 1.9.2@munin munin

我只需要添加命令/etc/munin/plugin-conf.d/munin-node 中相关插件的配置属性:

[my_plugin]
group rvm
command /usr/local/rvm/bin/munin_ruby %c

现在我可以使用我的 munin gemset 或为每个插件创建一个单独的 gemset。

答案2

就像错误消息所说的那样,env正在使用参数调用ruby,但找不到要执行的任何名为 ruby​​ 的东西。这意味着当 env 运行时,路径未正确设置以找到 ruby​​ 可执行文件。我假设在 /usr/local/lib/rvm 中配置了它。尝试在 cronjob 之外运行它,它可以工作吗?例如:

bash -c 'source /usr/local/lib/rvm rvm 1.9.2@munin && /usr/bin/munin-cron'

还可以尝试使用 -x 参数调用 bash,以便它在执行命令时将所有命令输出到 stderr ( bash -xc 'blah')。这应该可以帮助您找出问题所在。

通过 /usr/local/lib/rvm 搜索并查看它在哪里调用 env,然后从那里返回来确定为什么在调用 env 时 $PATH 设置不正确。

相关内容