2014-08-29 34 views
1

我想要实现的是一个capistrano3任务,它在所有服务器上执行日志文件grep - 这将节省大量时间,因为我们有一个很多服务器都是这样做的,所以手动或者甚至是脚本化的,但是会依次耗时。当执行的命令没有返回任何内容时sshkit捕获是否可能不会返回

我有一个粗糙的边缘任务实际上工作,除非其中一个服务器没有返回任何grep。在这种情况下,整个命令都会结束。

因此想知道是否有办法设置capture接受空回报。

namespace :admin do 
    task :log_grep, :command, :file do |t,args| 
    command = args[:command] || 'ask for a command' 
    file = args[:file] || 'log_grep_results' 
    outs = {} 
    on roles(:app), in: :parallel do 
     outs[host.hostname] = capture(:zgrep, "#{command}") 
    end 

    File.open(file, 'w') do |fh| 
     outs.each do |host,out| 
     fh.write(out) 
     end 
    end 
    end 
end 

回答

2

如果任何人来到这个问题,这里的解决方案 - raise_on_non_zero_exit: false

我想:

resp = capture %([ -f /var/run/xxx/xxx.pid ] && echo "ok") 

错误:

SSHKit::Command::Failed: [ -f /var/run/xxx/xxx.pid ] && echo "ok" exit status: 1 
[ -f /var/run/xxx/xxx.pid ] && echo "ok" stdout: Nothing written 
[ -f /var/run/xxx/xxx.pid ] && echo "ok" stderr: Nothing written 

解决方案:

resp = capture %([ -f /var/run/xxx/xxx.pid ] && echo "ok"), raise_on_non_zero_exit: false 
# resp => "" 
+0

这救了我的一天。 – sahil 2016-11-23 08:22:33

0

所以我所做的工作就是开始在回购中添加我所谓的Capistrano实用程序脚本。然后capistrano运行这些脚本。所有的脚本都是grep和一些逻辑输出的东西,如果返回是空的封装。

Capistrano的代码:

namespace :utils do 
    task :log_grep, :str, :file, :save_to do |t,args| 
    command_args = "#{args[:str]} #{args[:file]}" 
    outs = {} 
    on roles(:app), in: :parallel do 
     outs[host.hostname] = capture(:ruby, "#{fetch(:deploy_to)}/current/bin/log_grep.rb #{args[:str]} #{args[:file]}") 
    end 

    file = args[:save_to] 
    file ||= 'log_grep_output' 
    File.open(file, 'w') do |fh| 
     outs.each do |host,out| 
     s = "#{host} -- #{out}\n" 
     fh.write(s) 
     end 
    end 
    end 
end 

Ruby脚本log_grep.rb:

a = `zgrep #{ARGV[0]} #{ARGV[1]}` 
if a.empty? 
    puts 'Nothing Found' 
else 
    puts a 
end 
相关问题