[英]Capistrano: how to run a command-line rake task and rescue only for specific errors?
在Capistrano部署中,我們有一項任務來確保Solr(通過Sunspot gem)正在運行:
run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start"
但是,如果Solr已經在運行,這將引發錯誤,從而殺死部署,因此我們添加; true
在命令末尾返回; 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中的特定錯誤進行搶救? 理想情況下,我還希望擺脫冗長且丑陋的錯誤跟蹤,但這當然是第二要注意的問題。
我沒有回答您的問題,但是您可以確保該命令不會嘗試啟動已經運行的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
運行,則應該存在),而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進程,所以您可能必須使用更精確的詞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.