UnicornにUSR2シグナル送っても無視される(Bundler::GemfileNotFound)


久しぶりにQiita書くよ!

ruby (1.9.3p194)
rails (3.2.2)
capistrano (2.12.0)
unicorn (4.3.1)

--

なにがおこっていたか

Unicornを再起動(人によってはリロードと呼ぶ)をするときUSR2シグナルを送りますよね。

kill -s USR2 `cat unicorn.pid`

みたいな。

んで、これでだいたいはうまくいっていたんだけど、
アプリケーションコードの再読み込み時々うまくいかないことがありました。

下記みたいに無理やり再起動すりゃいんだけど。

kill -s QUIT `cat unicorn.pid`
unicorn_rails ...

気持ち悪いので調べてみたら、UnicornがログでBundler::GemfileNotFoundを吐いていた。

今まで気づかなくてゴメン!!!って感じです。
ヤバイんで止まらずに動いててくれたって感じっすね。

--

どうしたか

ぐぐったら普通にでてきました。
素晴らしい記事。

FIXING THE GEMFILE NOT FOUND (BUNDLER::GEMFILENOTFOUND) ERROR
http://blog.willj.net/2011/08/02/fixing-the-gemfile-not-found-bundlergemfilenotfound-error/

この人も苦労したみたいだけど、
要するにcapistranoの前のデプロイ先のGemfileを参照しているから問題なんだよ!って話。

だから無理やりsymlinkを通した指定をしてあげましょう。

deproy.rb
before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "/path/to/app/current/Gemfile"
end

設定変えた後はUSR2じゃなくて一度設定読み直さなきゃいけないので、一度落としましょ。
(HUPシグナルでもいけんのかな?試してないので分からん)

--

感想

capistrano-unicornってgemあったけど、うまくハマらなかったので結局入れなかったんだよねー
そういうcapistrano integration系のgemでスッキリいくと楽なんだが。

このdeploy.rbでゴリゴリ対応するあたりが楽しく感じつつも苦しかったり。
でもでも、解決法がだいたい提示されているRubyコミュニティってすごい。

こんな感じでした。