【问题标题】:RVM ruby version misinteraction with FreeBSD serviceRVM ruby​​ 版本与 FreeBSD 服务的误交互
【发布时间】:2025-11-27 06:10:01
【问题描述】:

所以我安装了 RVM,将 root 和 $account 放入 rvm 组。

$account 将 ruby​​ 1.9.3-p551 安装到 RVM 中,我设置 RVM 以启用

rvm use 1.9.3

然后我检查

ruby -v
ruby 1.9.3-p551 (2014-11-13 revision 48407) [x86_64-freebsd10.1]

这证实了 ruby​​ 已从系统范围的 2.1 更改为 rvm-masked 1.9.3

我尝试运行的服务是 Snorby,如果这有助于睁开眼睛,所以我开始使用它

service snorby start

它的回复

ruby1.9.3-p551 is not installed.
To install do: 'rvm install ruby-1.9.3-p551'
ruby1.9.3-p551 is not installed.
To install do: 'rvm install ruby-1.9.3-p551'
ruby1.9.3-p551 is not installed.
ruby: ruby-1.9.3-p551 not available via rvm (exit code 1)

如果我解释正确,ruby 是返回最后一个错误的那个,这让我认为某些脚本要么期望 ruby​​-1.9.3-p551 位于它不是的环境变量中,要么当我尝试运行服务脚本,它在不同的用户下运行,因此需要添加到 rvm 组。

为了尝试确认,我在几乎所有相关文件所在的目录之一中运行了 grep:

grep -rnwl '/usr/local' -e "is not installed"

只是为了找到可能读取此错误的脚本,几乎所有返回的脚本都与 ruby​​ 或 rvm 相关。我不确定下一步该去哪里,因为重新安装 1.9.3 并不能解决问题,我不想随意修改配置。

附录_1.1:

经过进一步研究,附录_1 的其余部分被误导,在脚本中 $0 将解析为正确的目录,因此两个帐户都正确解析为

/correct/directory

我会将附录_1 的其余部分用斜体字作为背景材料。

我查看了服务脚本并意识到它试图读取我拥有的 $account 的错误目录中的 .ruby-version,在所有其他帐户上,以下代码:

echo $(cd $(dirname $0)/.. && pwd)

结果:

/correct/dir

但在 $account 中,结果是:

/

附录_2:

进一步的研究表明 $?正在用于检查退出代码,它们根本没有排队。当我通过执行测试 $account 中的退出代码时

rvm use $version >/dev/null; echo $?

返回0,表示一切正常。

当我编辑脚本并强制它回显 $?使用后

rvm use $dynamically_acquired_version >/dev/null

它返回 1,这让我怀疑脚本是作为不同的 $account 运行的。我什至检查了 $version = $dynamically_acquired_version 是否相同。

附录_3:

通过在脚本开头注入以下内容来证实我的怀疑:

if [ -z "$USER" ]; then
  echo "USER IS NULL"
fi

用户改变了,实际上甚至没有定义,我安装 RVM 的方式是 rvm 组中只有 root 和 $account。希望事情很快就会好起来。

当更多结果出现时,我会进一步更新,如果有人遇到这种情况,尽管在我挖掘的时候随意扔给我一根骨头。

【问题讨论】:

  • 你的 RVM 安装在哪里?

标签: ruby service rubygems rvm


【解决方案1】:

您需要检查 rvm 是否正确加载到您的服务脚本中。将此命令放入您的脚本中

type rvm | head -1

它应该输出rvm is a function。如果没有,您需要正确加载您的 rvm:

\# Load RVM into a shell session *as a function*
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then

  \# First try to load from a user install
  source "$HOME/.rvm/scripts/rvm"

elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then

  \# Then try to load from a root install
  source "/usr/local/rvm/scripts/rvm"

else

  printf "ERROR: An RVM installation was not found.\n"

fi

如果对您不起作用,请将 $HOME 更改为绝对路径。正确加载 rvm 后,您可以在脚本中进一步使用通常的 rvm use <version>

详情请看这里:http://rvm.io/workflow/scripting

【讨论】:

  • 谢谢你,我实际上在等着看我是否能清楚地以 root 安装的方式进行安装,因为这是一个大型多用户系统。