2012-11-23 38 views
5

我使用IO.popen來啓動一個子進程,但是我只得到子進程運行所花費的時間(有時5分鐘或其他)的結果退出。我真的需要能夠看到子進程寫入stderrstdout的所有內容。從子進程中連續讀取STDOUT和STDERR

到目前爲止,我找不到任何這樣的作品,但我相信這是可能的。

+0

Ps:當我發現STDOUT被緩衝時,STDERR不是。注意這一點。 –

回答

7

,如果你需要得到實時輸出我會建議使用的STDLIB PTY代替popen

是這樣的:

require 'pty' 

cmd = 'echo a; sleep 1; cat /some/file; sleep 1; echo b' 
PTY.spawn cmd do |r, w, pid| 
    begin 
    r.sync 
    r.each_line { |l| puts "#{Time.now.strftime('%M:%S')} - #{l.strip}" } 
    rescue Errno::EIO => e 
    # simply ignoring this 
    ensure 
    ::Process.wait pid 
    end 
end 
exit "#{cmd} failed" unless $? && $?.exitstatus == 0 

> 33:36 - a 
> 33:37 - cat: /some/file: No such file or directory 
> 33:38 - b 

這種方式所得到的輸出瞬間,就像在終端

0

您可能想要使用標準庫中的Open3.popen3,它可以訪問作爲流的stdin,stdout和stderr。

+1

Open3.popen3在發生輸出流時不提供訪問權限。 –

相關問題