【问题标题】:How to continue when script fails(errors) and capture the output using Capistrano 3如何在脚本失败(错误)时继续并使用 Capistrano 3 捕获输出
【发布时间】:2014-01-14 20:59:23
【问题描述】:

在 Capistrano 2.x 中,您可以简单地添加 :on_error => :continue 像这样:

task :bad_script, :on_error => :continue do
    my_error = capture('/path/to/tomcat/shutdown.sh')
end

我在 Capistrano 3.x 或 ssh-kit(底层通信)中看不到任何方法。任何帮助将不胜感激。

task :bad_script do
  server_is_down
    on roles :all do
      begin
        server_is_down = capture('/path/to/tomcat/shutdown.sh')
      rescue
        #do something if server_is_down has the correct text
      end
    end
  end
end

我尝试在开始/救援块中包围新方法,但这只会阻止它出错,但不会返回错误的输出。

我仍然想知道如何做到这一点,但我想出了一种方法来解决我的一个案例需要它,那就是如果它失败,只需设置服务器关闭。

task :bad_script do
  server_is_down = false
    on roles :all do
      begin
        execute('/path/to/tomcat/shutdown.sh')
      rescue
        server_is_down = true
      end
    end
  end
end

这是假设它仅在关机发生时出错。

【问题讨论】:

    标签: ruby deployment capistrano capistrano3 sshkit


    【解决方案1】:

    您可以抑制错误并将 stderr 重定向到这样的变量:

    capture('output_from_tomcat_shutdown=`/path/to/tomcat/shutdown.sh 2>&1` || echo $output_from_tomcat_shutdown')
    

    【讨论】:

      【解决方案2】:

      capture 的输出只有在该方法没有失败时才会返回。如果它引发异常,它就不可能返回一个值(因为异常处理将控制)。因此,为了从捕获命令中获得一些响应,您需要它返回您需要的值作为引发异常的一部分,或者不引发异常,只返回一个错误代码(加上您需要获得)。

      【讨论】:

      • 从我在github.com/capistrano/sshkit/blob/… 中看到的,它不应该引发任何异常
      • 来自github.com/capistrano/sshkit/blob/… "如果主机出现问题,执行并引发错误 do |host| execute!(:echo, '"Example Message!" 1>&2; false') end 这将引发 SSHKit::Command:Failed 并出现 #message "Example Message!"`,这将导致命令中止。"
      • 我无法控制引发的异常,那么如何在该异常中返回一些值?我知道捕获是如何工作的,我希望它在失败时返回一些东西。脚本无法正常工作的原因有很多,我想寻找某个脚本并在它出现“错误”时做一些事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多