使用了错误的Ruby解释器

时间:2012-12-17 06:41:13

标签: ruby rvm eventmachine

我正在尝试设置Apache / Thin来支持我的Rails 3.2.9应用程序,这意味着将Apache和Thin都设置为守护进程。我正在使用运行Ruby 1.9.3-p286的RVM / gemset,但是,我的守护进程似乎并不想使用它,而是选择安装了一些非RVM系统的Ruby 1.8.7。

当我开始瘦身时,这是我收到的错误:

ubuntu@ip-1-1-1-1:~/www/mydomain/mysite$ /etc/init.d/thin start
/usr/local/rvm/gems/ruby-1.9.3-p286@mysite/gems/eventmachine-1.0.0/lib/rubyeventmachine.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]

Aborted (core dumped)

同样,使用sudo的相同命令会产生:

ubuntu@ip-1-1-1-1:~$ sudo /etc/init.d/thin start
[start] /etc/thin/mysite.yml ...
Starting server on 127.0.0.1:5000 ... 

# However, it refuses connections and crashes, evidenced by:
ubuntu@ip-1-1-1-1:~/www/mydomain/mysite/log$ cat thin.5000.log
>> Writing PID to tmp/pids/thin.5000.pid
>> Using rack adapter
>> Exiting!
/usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- bundler/setup  (LoadError)
from /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `require'
...

我认为分段错误是由于错误的Ruby版本造成的。显然,它使用的是1.8.7,这不是我想要的Ruby。但是,检查ruby版本看起来似乎没问题:

ubuntu@ip-1-1-1-1:~$ which ruby
/usr/local/rvm/rubies/ruby-1.9.3-p286/bin/ruby
ubuntu@ip-1-1-1-1:~$ ruby -v
ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-linux]

此处它再次在sudo下运行:

ubuntu@ip-1-1-1-1:~$ sudo which ruby
/usr/bin/ruby
ubuntu@ip-1-1-1-1:~$ sudo ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]

当我将Thin作为守护进程运行时,如何让我的系统使用Ruby 1.9.3,并避免这些讨厌的错误?

修改

这是我的/etc/init.d/thin文件的样子(我相信它是使用瘦安装自动生成的):

#!/bin/sh
### BEGIN INIT INFO
# Provides:          thin
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: thin initscript
# Description:       thin
### END INIT INFO

# Original author: Forrest Robertson

# Do NOT "set -e"

DAEMON=/usr/local/bin/thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
        $DAEMON start --all $CONFIG_PATH
        ;;
  stop)
        $DAEMON stop --all $CONFIG_PATH
        ;;
  restart)
        $DAEMON restart --all $CONFIG_PATH
        ;;
  *)
        echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
        exit 3
        ;;
esac
  • 戴夫

2 个答案:

答案 0 :(得分:3)

想出来(至少,我让它以一种方式工作......)

在RVM网站上使用this建议......

  1. 确保您的服务(在我的情况下,thin)安装在您的一个RVM gemsets中。
  2. 使用:rvm wrapper ruby-1.9.3@mygemset bootup thin生成包装器,根据您的安装替换参数。它将创建一个脚本/usr/local/rvm/bin/bootup_thin。这个包装器将使用您在调用中指定的gemset加载瘦。
  3. 编辑/etc/init.d/thin脚本。通过将DAEMON=/usr/local/bin/thin设置为DAEMON=/usr/local/rvm/bin/bootup_thin
  4. ,让脚本调用生成的Ruby包装器
  5. 运行你的守护进程;它现在应该使用正确的Ruby环境。
  6. 在遇到这个障碍后,我立即遇到了一个无关的“陷阱”,这与我申请所需的遗失宝石有关。我认为它与我的应用程序文件夹和守护进程之间使用的不同gemset有关。你可能要做我做的事;导航到应用程序根目录,显式更改为守护程序使用rvm gemset use使用的gemset,然后运行bundle install将必要的gem安装到守护程序使用的gemset中。
  7. 有了这个,我让我的服务器运行Apache / Thin。对于那些希望这样做的人,请使用这些页面。

    第一名:http://articles.slicehost.com/2008/5/6/ubuntu-hardy-thin-web-server-for-ruby

    第二名:http://articles.slicehost.com/2008/5/6/ubuntu-hardy-apache-rails-and-thin

答案 1 :(得分:0)

您可以编辑/etc/init.d/thin并更改此部分:

run_action() {
        ACTION="$1"

        if [ -x /usr/bin/ruby1.8 ]; then
            /usr/bin/ruby1.8 $DAEMON $ACTION --all /etc/thin1.8
        fi

        if [ -x /usr/bin/ruby1.9.1 ]; then
            /usr/bin/ruby1.9.1 $DAEMON $ACTION --all /etc/thin1.9.1
        fi

}