以下链接到我的独角兽的init脚本。 https://gist.github.com/1466775
重启命令对我来说从未奏效。我在每次部署后使用升级来重启unicorn。但是每当有新的宝石被添加等重大变化时,升级都不会起作用。最近,我用airbrake替换了hoptoad gem,并且错误地说'未初始化的恒定Airbrake(NameError)'。但当我停下来再次开始独角兽时,它运作良好。问题出在init脚本或其不同的问题上吗?
感谢。
答案 0 :(得分:12)
根据您的init脚本,“/ bin / init.d / unicorn restart”将HUP信号发送到unicorn主进程
------裁剪
restart|reload)
sig HUP && echo reloaded OK && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
su - $USER -c "$CMD"
-----裁剪
这就是HUP对独角兽进程的作用:
重新加载配置文件并正常重启所有工作人员。如果“preload_app”指令为false(默认值),则工作人员还会在重新启动时获取任何应用程序代码更改。如果“preload_app”为true,则应用程序代码更改将不起作用。
您正在寻找的是USR2信号,您的升级参数是独角兽已经在做什么!
USR2信号重新执行正在运行的二进制文件。一旦确认孩子已启动并正在运行,应将单独的QUIT发送到原始流程。
答案 1 :(得分:10)
我有一个非常类似的问题,最后found the solution
之前我查看了日志,但显然没有看到(Bundler::GemfileNotFound)
错误。事实证明,对早期版本有旧的引用,一旦gem文件发生变化,新的master会无声地失败。尾巴-f你的独角兽日志,看看会发生什么。我的问题都是根据我的unicorn.rb中的以下链接修复的。
before_exec do |server|
ENV['BUNDLE_GEMFILE'] = "#{root}/Gemfile"
end
答案 2 :(得分:2)
我有同样的问题,但我使用的rbenv是按用户安装的。 我使用了init script
我发现自从我的rbenv按用户安装后,我需要稍微改变一下:
CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
用这个:
CMD="cd $APP_ROOT; ~/.rbenv/bin/rbenv exec bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
希望它会对你有所帮助!
P.S。或者其他人,因为它是一个老问题=)
答案 3 :(得分:0)
我通过从
更改我的unicorn init.d脚本来修复此问题CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging"
到此:
CMD="cd $APP_ROOT; BUNDLE_GEMFILE=$APP_ROOT/Gemfile bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging"
这似乎指向每个新版本上的新bundle gem文件。 从this merge request
中获取灵感