RVM ruby 版本与 FreeBSD 服务的错​​误交互

RVM ruby version misinteraction with FreeBSD service

所以我安装了 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 不能解决问题,我不想随意修改配置。

Addendum_1.1:

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

/correct/directory

我将 Addendum_1 的剩余部分用斜体表示,以作为背景 material。

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

echo $(cd $(dirname [=17=])/.. && pwd)

结果:

/correct/dir

但在 $account 中结果是:

/

Addendum_2:

进一步的研究表明 $?用于检查退出代码,它们根本没有排队。当我通过

测试 $account 中的退出代码时
rvm use $version >/dev/null; echo $?

是returns0,表示一切正常。

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

rvm use $dynamically_acquired_version >/dev/null

它 returns 1,这让我怀疑脚本被 运行 作为一个不同的 $account。我什至检查了 $version = $dynamically_acquired_version 并且它们都是相同的。

Addendum_3:

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

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

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

当有更多结果出现时,我会进一步更新这个,如果有人碰巧遇到这个,尽管在我挖掘的时候随时给我一个骨头。

您需要检查您的服务脚本中是否正确加载了 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