2014-08-29 69 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 
相關問題