【问题标题】:Capistrano: how to run a command-line rake task and rescue only for specific errors?Capistrano:如何运行命令行 rake 任务并仅针对特定错误进行救援?
【发布时间】:2013-05-05 20:04:32
【问题描述】:

在我们的 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 中的特定错误进行救援? 理想情况下,我还想摆脱长而丑陋的错误跟踪,但仅此而已当然是次要的问题。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 solr capistrano sunspot


    【解决方案1】:

    我没有回答您的问题,但您可以确保该命令不会尝试启动已运行的 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
    

    我在 grep 参数中使用[s],否则ps aux 命令会自行捕获。我不确定哪个短语适合查找 solr 过程,因此您可能必须使用更精确的内容。

    【讨论】:

    • 谢谢,正是我想要的!我最终将“run”替换为“capture”以防止 Capistrano 打印整个 ps aux 命令,然后通过正则表达式搜索捕获的字符串以确定 Solr 是否正在运行。
    猜你喜欢
    • 2010-09-23
    • 2020-08-31
    • 2011-09-25
    • 1970-01-01
    • 2015-04-15
    • 2014-07-12
    • 2020-01-17
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多