0

Capistrano のデプロイでは、(Sunspot gem を介して) Solr が実行されていることを確認するタスクがあります。

run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start"

ただし、Solr が既に実行されている場合はエラーがスローされ、デプロイが; true強制終了されるため、コマンドの最後に追加して、Capistrano が終了するようにします。

run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start; true"

これには 2 つの問題があります。

  1. より深刻なエラーが発生した場合でも実行を継続します。その場合、デプロイを停止します。
  2. 長くて醜いエラートレースを出力します。

このコマンドをブロックに入れてbegin … rescue、メッセージを次のように一致させようとしました:

begin
  run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start"
rescue RuntimeError => failure
  if failure.message =~ /#{text_to_match}/
    logger.debug "Solr is already running: continuing"
  else
    raise failure
  end
end

残念ながら、messageエラーは "failed: " の後に失敗したコマンドが続くだけなので、既に実行されているサーバーの良性のエラーと、おそらくより悪性の他のエラーを区別することはできません。また、長くて醜いエラートレースも出力されるため、どちらの問題も解決されません。

コマンドラインの rake タスクを実行し、Capistrano で特定のエラーに対してのみレスキューする方法はありますか? 理想的には、長く醜いエラー トレースも取り除きたいのですが、もちろんそれは二次的な問題です。

4

1 に答える 1

0

あなたの質問に対する答えはありませんが、コマンドが実行中の solr を開始しようとしないことを確認できます。

run "cd #{current_path} && if [ ! -f #{solr_pid} ]; then RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start; fi

solr.pid(solrがデーモンとして実行されている場合はそこにあるはずです)、そのsolr_pidpidへのパスがあると思います。

更新: ps auxsolr プロセスが実際に実行されているかどうかを確認するために使用することもできます。

if ! ps aux | grep -q "[s]olr production" ; then echo 'solr not running'; fi

そうしないとコマンドがそれ自体をキャッチする[s]ため、grep引数で使用しています。ps auxsolr プロセスを見つけるのにどのフレーズが適切かはわかりません。おそらく、より正確なものを使用する必要があります。

于 2013-05-11T05:55:08.627 に答える