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。
所以我安装了 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。