简体   繁体   English

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

[英]Ubuntu: 'unicorn_init.sh start' works, but 'service unicorn_init start' does NOT

I have installed nginx with unicorn on an Ubuntu 12.04 server. 我在Ubuntu 12.04服务器上安装了nginx和unicorn。 Everything works, site, db, unicorn...good. 一切正常,网站,数据库,独角兽...好。 So I'm trying to make sure that after a reboot, nginx and unicorn start up. 所以我试图确保重启后,nginx和unicorn启动。 I have set update-rc.d for my unicorn process, but it doesn't start/work after a reboot. 我为我的独角兽进程设置了update-rc.d,但是在重启后它没有启动/工作。 I suspect it has something to do with ubuntu's use of "service" as opposed to "/etc/init.d/unicorn_init " 我怀疑它与ubuntu使用“服务”而不是“/etc/init.d/unicorn_init”有关

In other words: 换一种说法:

If I execute: 如果我执行:

$ /etc/init.d/unicorn_init start

unicorn starts up just fine, no errors. 独角兽开始很好,没有错误。

If I execute: 如果我执行:

$ service unicorn_init start

it fails and unicorn does not start. 它失败了,独角兽没有开始。

I've think it has something to do with paths. 我认为它与路径有关。 Ive added environment PATHS to PATH, GEM_PATH, & GEM_HOME, but I still receive the same results 我已经将环境PATHS添加到PATH,GEM_PATH和GEM_HOME,但我仍然收到相同的结果

1, If I run /usr/local/rvm/gems/ruby-1.9.3-p194/bin/unicorn, I get errors: 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, If I run /var/rails/web-app/bin/unicorn, I get errors: 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>'

Any help would be greatly appreciated! 任何帮助将不胜感激! Thanks 谢谢

you should use an unicorn wrapper script that will include all the required environment variables: 你应该使用一个包含所有必需的环境变量的独角兽包装脚本:

rvm wrapper 1.9.3 ruby-1.9.3 unicorn

It will generate ruby-1.9.3_unicorn use this instead of just unicorn in the init script. 它将生成ruby-1.9.3_unicorn在init脚本中使用它而不仅仅是unicorn。

You can find more details on wrappers with: 你可以找到有关包装的更多细节:

rvm wrapper

In case when work is done via bundler (like capitrano) then generate a wrapper for bundle : 如果通过bundler(如capitrano)完成工作,那么为bundle生成一个包装器:

rvm wrapper 1.9.3 ruby-1.9.3 bundle

and use the full path to the wrapper as displayed by this command: 并使用此命令显示的包装器的完整路径:

which ruby-1.9.3_bundle

You told right, Eric, I do it by myself and run in development mode is fine. 你告诉对了,Eri​​c,我自己做,并且在开发模式下运行很好。 This example can't be used properly, it is still very crude. 这个例子不能正确使用,它仍然非常粗糙。

My config/unicorn_init file: 我的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

This is an update to this question/answer from 6 years ago. 这是6年前这个问题/答案的更新。 As of RVM 1.29.4 and Ubuntu 16.04 . RVM 1.29.4Ubuntu 16.04开始 The answer from mpapis is still valid for older versions of ubuntu and rvm. mpapis的答案对旧版本的ubuntu和rvm仍然有效。

As of RVM 1.29.4 , the above answer vm wrapper 1.9.3 ruby-1.9.3 unicorn no longer works, nor is it neccessary anymore. RVM 1.29.4开始 ,上面的回答vm wrapper 1.9.3 ruby-1.9.3 unicorn不再有效,也不再需要了。

Wrappers are already created, and can be found in their location along with the proper gemset if needed. 已经创建了包装器,如果需要,可以在它们的位置找到适当的gemset。

Look in the following directory location /usr/local/rvm/wrappers . 查看以下目录位置/usr/local/rvm/wrappers There you will find a link to your desired ruby version & gemset. 在那里你会找到一个指向你想要的ruby版本和gemset的链接。 Following that link will bring you to all of it's wrappers: unicorn, unicorn_rails, god, puma, thin, thor, ... , etc. 以下链接将带您到所有的包装: unicorn, unicorn_rails, god, puma, thin, thor, ... 等。

Example: 例:

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"

Alternatively you could also use the direct path as well: 或者你也可以使用直接路径:

DAEMON=/usr/local/rvm/gems/ruby-2.5.1@app/wrappers/unicorn

You get the idea (^_^) 你明白了(^_^)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM