我尝试运行一些用 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 设置不正确。