2012-12-28 65 views
0

我的ruby腳本應該處理多個外部進程,所以我想知道如何將不同進程的輸出重定向到不同的日誌文件。另外,由於外部流程需要花費相當多的時間才能完成,因此並行處理它們的最佳方法是什麼?ruby​​重定向多個進程輸出到日誌

由於我是新來的紅寶石,我可以告訴你一個殼等效代碼:

LOGDIR="/tmp/test" 
for host in $(h1 h2 h3 h4); do 
    (ssh [email protected]${host} 'sh /tmp/scripttorun' >> ${LOGDIR}/${host}.log 2>&1) & 
    sleep 5 
done 
wait #wait for all subprocesses to complete 
+0

有關這些「外部過程」的性質的一些澄清將有所幫助。這些命令行過程是什麼?你打電話給其他網站嗎? – quandrum

+0

是的,它們是使用net/ssh在多個系統上執行的命令行程序。 – Ashrith

+0

[你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Foggzie

回答

0

它的優良使用一個非常類似的方法爲你的輸出重定向到日誌文件,即使用反引號或%x如果您選擇:

`cp -v some/file/that/does/not/exist some/file/name >> /path/to/stdout.log 2>>/path/to/stderr.log` 

如果你想傳遞變量的值,使用:

`ssh [email protected]#{host} 'sh /tmp/scripttorun' >> #{LOGDIR}/#{host}.log 2>&1` 

這一切都假設你使用SSH密鑰。 SSH不會在沒有它們的情況下建立連接,而是會暫停並提示輸入密碼,導致您的代碼掛起。您需要以編程方式使用Net :: SSH gem來解決這種情況。

爲了平行處理它們,我建議您查看EventMachineEM-SSH

+0

明白了,謝謝! – Ashrith

0

我在Ruby中想出了代碼如下:

@pids = [] 
hosts = %w(h1 h2 h3 h4) 
hosts.each do |host| 
    @pids << Kernel.fork { `ssh [email protected]#{host} 'sh /tmp/test' >> #{LOGDIR}/#{host}.log 2>&1` } 
end 
@pids.each { |pid| Process.wait(pid) } 

請添加如果此實現有一些缺點。

相關問題