在我们的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"
这有两个问题:
我尝试将此命令放在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中的特定错误进行救援?理想情况下,我还想摆脱冗长,丑陋的错误跟踪,但那是当然是次要问题。
答案 0 :(得分: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作为deamon运行它应该在那里)并且solr_pid
是该pid的路径。
更新:您还可以使用ps aux
检查solr进程是否真正在运行:
if ! ps aux | grep -q "[s]olr production" ; then echo 'solr not running'; fi
我在grep参数中使用[s]
,因为否则ps aux
命令会自行捕获。我不确定找到solr进程的短语是什么,所以可能你必须使用更精确的东西。