[英]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,但我仍然收到相同的结果
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>'
/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. 你告诉对了,Eric,我自己做,并且在开发模式下运行很好。 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.4和Ubuntu 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.