2009-04-17 161 views
46

我正在使用Capistrano运行远程任务。我的任务是这样的:Capistrano&Bash:忽略命令退出状态

task :my_task do 
    run "my_command" 
end 

我的问题是,如果my_command有一个退出状态= 0,那么Capistrano的认为失败并退出!退出状态不为0时,如何让capistrano继续退出?我已经将my_command更改为my_command;echo,它可以工作,但感觉像是黑客。

回答

75

最简单的方法是将true添加到命令的末尾。

task :my_task do 
    run "my_command" 
    end 

变为

task :my_task do 
    run "my_command; true" 
    end 
+12

不知道什么capistano是,但我发现我的方式在这里由于与bash相同的问题。然后你可以使用“my_command || true”而不是“my_command; true” – Zitrax 2010-09-30 16:03:45

5

如果您希望它对退出代码执行不同的操作,您需要修补Capistrano代码;如果退出状态不为零,则硬编码会引发异常。

这是lib/capistrano/command.rb的相关部分。以if (failed开头的行是重要的行。基本上它说如果有任何非零的返回值,会引发错误。

# Processes the command in parallel on all specified hosts. If the command 
# fails (non-zero return code) on any of the hosts, this will raise a 
# Capistrano::CommandError. 
def process! 
    loop do 
    break unless process_iteration { @channels.any? { |ch| !ch[:closed] } } 
    end 

    logger.trace "command finished" if logger 

    if (failed = @channels.select { |ch| ch[:status] != 0 }).any? 
    commands = failed.inject({}) { |map, ch| (map[ch[:command]] ||= []) << ch[:server]; map } 
    message = commands.map { |command, list| "#{command.inspect} on #{list.join(',')}" }.join("; ") 
    error = CommandError.new("failed: #{message}") 
    error.hosts = commands.values.flatten 
    raise error 
    end 

    self 
end 
+0

我想这只是卡皮斯特拉诺2,卡皮斯特拉诺3,你可以使用[Ciryon的回答](http:// stackoverflow。com/a/23424213/345959) – Smar 2017-02-20 15:47:29

2

我只是重定向STDERR和STDOUT到/ dev/null的,所以你的

run "my_command" 

成为

run "my_command > /dev/null 2> /dev/null" 

这适用于标准的Unix工具相当不错,在那里,说,CP或者ln可能会失败,但是您不想停止部署这样的失败。

7

+ grep +命令根据找到的内容退出非零。在你关心的输出,但不介意它是空的使用情况下,你会放弃默默地退出状态:

run %Q{bash -c 'grep #{escaped_grep_command_args} ; true' } 

通常情况下,我认为第一个方案是就好了 - 我使其成为自己的文件:

cmd = "my_command with_args escaped_correctly" 
run %Q{bash -c '#{cmd} || echo "Failed: [#{cmd}] -- ignoring."'} 
4

,我觉得这样做最简单的选择:

run "my_command || :" 

注意::是NOP指令所以退出代码将完全忽略。

30

对于Capistrano的3,你可以(作为建议here)使用以下命令:

execute "some_command.sh", raise_on_non_zero_exit: false 
+1

为我工作最好。 – khelll 2014-12-06 15:39:59