0

在我们的 Capistrano 部署中,我们有一个任务来确保我们的 Solr(通过 Sunspot gem)正在运行:

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"

这有两个问题:

  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错误只是“失败:”,然后是失败的命令,这使我无法区分已经运行的服务器的良性错误和可能更恶性的其他错误。它还仍然打印出又长又丑的错误跟踪,所以我的问题都没有解决。

有没有办法运行命令行 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_pid是该 pid 的路径。

更新:您还可以ps aux用来检查 solr 进程是否真的在运行:

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

[s]在 grep 参数中使用,因为否则ps aux命令会自行捕获。我不确定哪个短语适合找到 solr 过程,所以可能你必须使用更精确的东西。

于 2013-05-11T05:55:08.627 回答