2012-11-23 24 views
5

Sto utilizzando IO.popen per avviare un sottoprocesso, ma ottengo solo il risultato di tutto ciò che è accaduto nel tempo impiegato dal sottoprocesso per eseguire (a volte 5 minuti o qualsiasi altra cosa) quando il sottoprocesso uscite. Devo davvero essere in grado di vedere tutto ciò che il sottoprocesso scrive su stderr e stdout come e quando accade.Leggere STDOUT e STDERR dal sottoprocesso continuamente

Finora non sono riuscito a trovare nulla che funzioni in questo modo, ma sono sicuro che sia possibile.

+0

Ps: Come ho scoperto STDOUT è bufferizzato, STDERR non lo è. Sii consapevole di questo. –

risposta

7

se avete bisogno di ottenere l'output in tempo reale mi sento di raccomandare di utilizzare stdlib PTY invece di popen

qualcosa di simile:

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 

questo modo si ottiene in uscita istantaneamente, proprio come nel terminale

0

È possibile utilizzare Open3.popen3 dalla libreria standard per accedere a stdin, stdout e stderr come flussi.

+1

Open3.popen3 non consente l'accesso ai flussi di output non appena si verificano. –

Problemi correlati