2011-12-12 10 views
10

以下は、私のinitスクリプトfor unicornへのリンクです。 https://gist.github.com/1466775Unicornの再起動/アップグレードが機能しない

Restartコマンドは一度も機能しませんでした。私は各展開の後でunicornを再起動するためにアップグレードを使用しています。しかし、新しい宝石が追加されるような大きな変化がある場合は、アップグレードは機能しません。最近、私はホルトロードの宝石をエアブレーキで置き換え、「初期化されていないエアブレイク(NameError)」というエラーを出してしまいました。しかし、私が停止してユニコーンをやり直すと、うまくいきました。問題はinitスクリプトまたはその別の問題にありますか?

ありがとうございました。

答えて

11

あなたのinitスクリプトによると、 "/bin/init.d/unicorn再起動が"

ユニコーンマスター・プロセスにHUPシグナルを送る------

restart|reload) 
    sig HUP && echo reloaded OK && exit 0 
    echo >&2 "Couldn't reload, starting '$CMD' instead" 
    su - $USER -c "$CMD" 

をトリミング----

リロード設定ファイルと優雅にすべての労働者を再起動します。これは、HUPはユニコーンのプロセスに何をするかである

を-cropped。 "preload_app"ディレクティブがfalse(デフォルト)の場合、ワーカーは再起動時にアプリケーションコードの変更を取得します。 "preload_app"がtrueの場合、アプリケーションコードの変更は無効になります。

あなたが探しているのは、unicornへのアップグレードパラメータが既に行っているUSR2信号です。

USR2シグナルは実行中のバイナリを再実行します。子が起動して実行されていることが確認されると、別のQUITを元のプロセスに送信する必要があります。

+0

これは間違いありませんが、ユニコーンの設定が表示されていない場合、問題が何であるかはわかりません。基本的に、 'preload_app'をどこかでtrueに設定した場合は、" upgrade "コマンドを使用する必要があります。また、unicorn設定で余分なコードが必要になります。 Googleの「unicorn zero downtime deploy」では、例を挙げる必要があります。あなたが '** preload_app'を設定していなければ、あなたの' restart'が正しいオプションになりますが、サーバを完全に再起動し、そのサーバを一瞬オフラインにします。 – averell

10

私は私が前にログを見たが、明らかに(Bundler::GemfileNotFound)エラーを確認するために失敗していた

を非常によく似た問題を抱えていたし、最終的にfound the solution。以前のリリースの古いリファレンスがあり、gemファイルが変更されると、新しいマスターは自動的に失敗します。テール - あなたのユニコーンログは何が起こるか見るために。私の問題は、すべて私のunicorn.rb

before_exec do |server| 
    ENV['BUNDLE_GEMFILE'] = "#{root}/Gemfile" 
end 
+3

[This](https://github.com/sosedoff/capistrano-unicorn/commit/c1e7a3f2794dd070367d0808ad102a6d20d39cf2)は、やや良い解決策かもしれません。 – Anjan

+0

@anjanはい、nice find。私はカピストラーノ - ユニコーンの宝石を現時点では使用していませんが、それはそれらのための良い修正となるでしょう。 – toxaq

2

私は同じ問題を持っていた中で、以下のリンクごとに固定したが、私は、ユーザーごとにインストールされた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" 

が、それはあなたを助けることを願っています 私は少しこれを変更する必要が私のrbenvため、ユーザーごとにインストールされていることを考え出したこのinit script

を使用しました!

P.S.またはそれ以外の誰かが古い質問=)

0

私はこの問題を私のunicorn initを変更して修正しました。

CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging" 

からこれまでのDスクリプト:すべての新しいリリースで新しいバンドルgemfileを指すように思わ

CMD="cd $APP_ROOT; BUNDLE_GEMFILE=$APP_ROOT/Gemfile bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging" 

。 感動を込めてthis merge request

関連する問題