簡體   English   中英

Capistrano:如何運行命令行耙任務並僅針對特定錯誤進行救援?

[英]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"

這有兩個問題:

  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中的特定錯誤進行搶救? 理想情況下,我還希望擺脫冗長且丑陋的錯誤跟蹤,但這當然是第二要注意的問題。

我沒有回答您的問題,但是您可以確保該命令不會嘗試啟動已經運行的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM