Ubuntu:'unicorn_init.sh start'有效,但'service unicorn_init start'不起作用

时间:2012-05-04 18:32:42

标签: ruby-on-rails ubuntu nginx rvm unicorn

我在Ubuntu 12.04服务器上安装了nginx和unicorn。一切正常,网站,数据库,独角兽...好。所以我试图确保重启后,nginx和unicorn启动。我为我的独角兽进程设置了update-rc.d,但是在重启后它没有启动/工作。我怀疑它与ubuntu使用“服务”有关,而不是“/etc/init.d/unicorn_init”

换句话说:

如果我执行:

$ /etc/init.d/unicorn_init start

独角兽启动很好,没有错误。

如果我执行:

$ service unicorn_init start

失败,独角兽无法启动。

我认为它与路径有关。我已经将环境PATHS添加到PATH,GEM_PATH和& GEM_HOME,但我仍然收到相同的结果

1,如果我运行/usr/local/rvm/gems/ruby-1.9.3-p194/bin/unicorn,我会收到错误:

usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find unicorn (>= 0) amongst[bigdecimal-1.1.0, io-console-0.3, json-1.5.4, minitest-2.5.1, rake-0.9.2.2, rdoc-3.9.4] (Gem::LoadError)
    from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
    from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems.rb:1231:in `gem'
    from /usr/local/rvm/gems/ruby-1.9.3-p194/bin/unicorn:18:in `<main>'

2,如果我运行/ var / rails / web-app / bin / unicorn,我会收到错误:

/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- bundler/setup (LoadError)
    from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /var/rails/web-app/bin/unicorn:14:in `<main>'

任何帮助将不胜感激!感谢

3 个答案:

答案 0 :(得分:3)

您应该使用包含所有必需环境变量的独角兽包装脚本:

rvm wrapper 1.9.3 ruby-1.9.3 unicorn

它将生成ruby-1.9.3_unicorn在init脚本中使用它而不仅仅是unicorn。

您可以通过以下方式找到有关包装的更多详细信息:

rvm wrapper

如果通过bundler(如capitrano)完成工作,则生成bundle的包装器:

rvm wrapper 1.9.3 ruby-1.9.3 bundle

并使用此命令显示的包装器的完整路径:

which ruby-1.9.3_bundle

答案 1 :(得分:0)

你说对了,Eri​​c,我自己做,并且在开发模式下运行很好。 这个例子不能正确使用,它仍然非常粗糙。

我的config/unicorn_init文件:

TIMEOUT=${TIMEOUT-60}
PID=$APP_ROOT/tmp/pids/unicorn.pid
CMD="PATH=$_PATH GEM_HOME=$_GEM_HOME GEM_PATH=$_GEM_PATH $APP_ROOT/.bundle/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"

set -e
action="$1"
set -u

old_pid="$PID.oldbin"

cd $APP_ROOT || exit 1

sig () {
    test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
    test -s $old_pid && kill -$1 `cat $old_pid`
}

case $action in
start)
    sig 0 && echo >&2 "Already running" && exit 0
    su -c "$CMD" - $APP_USER
    ;;
stop)
    sig QUIT && exit 0
    echo >&2 "Not running"
    ;;
force-stop)
    sig TERM && exit 0
    echo >&2 "Not running"
    ;;
restart|reload)
    sig HUP && echo reloaded OK && exit 0
    echo >&2 "Couldn't reload, starting '$CMD' instead"
    su -c "$CMD" - $APP_USER
    ;;
upgrade)
    if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
    then
        n=$TIMEOUT
        while test -s $old_pid && test $n -ge 0
        do
            printf '.' && sleep 1 && n=$(( $n - 1 ))
        done
        echo

        if test $n -lt 0 && test -s $old_pid
        then
            echo >&2 "$old_pid still exists after $TIMEOUT seconds"
            exit 1
        fi
        exit 0
    fi
    echo >&2 "Couldn't upgrade, starting '$CMD' instead"
    su -c "$CMD" - $APP_USER
    ;;
reopen-logs)
    sig USR1
    ;;
*)
    echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
    exit 1
    ;;
esac
echo "#\!/bin/bash\n_PATH=$PATH\n_GEM_HOME=$GEM_HOME\n_GEM_PATH=$GEM_PATH\nAPP_ROOT=$(pwd)\nAPP_USER=$USER\n$(cat config/unicorn_init)" > config/unicorn_init.sh
chmod +x config/unicorn_init.sh

答案 2 :(得分:0)

这是6年前对此问题/答案的更新。从 RVM 1.29.4 Ubuntu 16.04 开始。 mpapis的答案对于旧版本的ubuntu和rvm仍然有效。

RVM 1.29.4 开始,上述答案app.yaml不再有效,也不再是必需的。

包装器已经创建,并且可以在需要的位置以及正确的宝石镶嵌中找到。

查找以下目录位置vm wrapper 1.9.3 ruby-1.9.3 unicorn。在这里,您会找到所需的红宝石版本和宝石集的链接。跟随该链接将带您进入所有包装器:/usr/local/rvm/wrappers等。

示例:

unicorn, unicorn_rails, god, puma, thin, thor, ...

或者,您也可以使用直接路径:

TIMEOUT=${TIMEOUT-60}

APP_ROOT=/var/rails/com.domain.site/current
PID=$APP_ROOT/tmp/pids/unicorn.pid
DAEMON=/usr/local/rvm/wrappers/ruby-2.5.1@app/unicorn

CMD="$DAEMON -D -c $APP_ROOT/config/unicorn.rb -E production"

您明白了(^ _ ^)