我使用IO.popen
來啓動一個子進程,但是我只得到子進程運行所花費的時間(有時5分鐘或其他)的結果退出。我真的需要能夠看到子進程寫入stderr
和stdout
的所有內容。從子進程中連續讀取STDOUT和STDERR
到目前爲止,我找不到任何這樣的作品,但我相信這是可能的。
我使用IO.popen
來啓動一個子進程,但是我只得到子進程運行所花費的時間(有時5分鐘或其他)的結果退出。我真的需要能夠看到子進程寫入stderr
和stdout
的所有內容。從子進程中連續讀取STDOUT和STDERR
到目前爲止,我找不到任何這樣的作品,但我相信這是可能的。
,如果你需要得到實時輸出我會建議使用的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
這種方式所得到的輸出瞬間,就像在終端
Ps:當我發現STDOUT被緩衝時,STDERR不是。注意這一點。 –