2016-10-19 3 views
2

Ich bin auf der Suche nach einem Ruby-Programm (eine Rake-Task) beobachten Sie eine Ausgabe von einem anderen Rake-Task. Der Ausgabeschreiber gibt an stderr aus. Ich würde gerne diese Zeilen lesen. Ich habe Schwierigkeiten, es einzurichten. Wenn ich einen Schriftsteller (stdout_writer.rb) haben, die ständig etwas druckt:Ruby Pipes, IO und Stderr Redirect

#!/usr/bin/env ruby 
puts 'writing...' 
while true 
    $stdout.puts '~' 
    sleep 1 
end 

und eine Datei, die es und Echos (stdin_reader.rb) lautet:

#!/usr/bin/env ruby 
puts 'reading...' 
while input = ARGF.gets 
    puts input 
    input.each_line do |line| 
    begin 
     $stdout.puts "got line #{line}" 
    rescue Errno::EPIPE 
     exit(74) 
    end 
    end 
end 

und ich versuche zu haben sie arbeiten zusammen, passiert nichts:

$ ./stdout_writer.rb 2>&1 | ./stdin_reader.rb 
$ ./stdout_writer.rb | ./stdin_reader.rb 

nichts ... obwohl, wenn ich nur in stdin_reader.rb echo, ich bekommen, was ich erwarten:

[email protected]:~/projects/opera_events/sendgrid-example-operaevent$ echo "ok true" | ./stdin_reader.rb 
reading... 
ok true 
got line ok true 
[email protected]:~/projects/opera_events/sendgrid-example-operaevent$ 

also wie würde ich ein Skript einrichten, das stderr piped, damit es es Zeile für Zeile lesen kann? Weitere Informationen: Das wird ein ubuntu Emporkömmling Service script1.rb | script2.rb, wo script1 eine Nachricht sendet, und script2 prüft, ob die Nachricht von script1

Antwort

0

Die Frage stdout_writer geschickt wurde zu sein, dass, wie läuft unendlich scheint, stdin_reader wird nie eine Chance bekommen zu lesen Die STDOUT von stdout_writer als das Rohr, in diesem Fall wartet auf stdout_writer fertig zu sein, bevor stdin_reader beginnt zu lesen. Ich testete dies, indem ich while true zu 5.times do änderte. Wenn Sie das tun, und 5 Sekunden warten, ist das Ergebnis der ./stdout_writer.rb | ./stdin_reader.rb

reading... 
writing... 
got line writing... 
~ 
got line ~ 
~ 
got line ~ 
~ 
got line ~ 
~ 
got line ~ 
~ 
got line ~ 

Dieses mit Ihrem Code nicht ein Problem an sich, sondern um so mehr ein Problem mit der Art und Weise, dass die Ausführung in Bezug auf STDOUT | STDIN Handhabung Arbeiten rubin .

Außerdem glaube ich nicht, dass ich jemals so viel gelernt habe, wie ich gelernt habe, diese Frage zu erforschen. Danke für die lustige Übung.

1

Die Ausgabe von stdout_writer.rb wird von Ruby gepuffert, so dass der Leserprozess es nicht sieht. Wenn Sie lange genug warten, sollten Sie sehen, dass das Ergebnis in Blöcken angezeigt wird.

Sie drehen können Pufferung ab und erhalten das gewünschte Ergebnis zu Beginn der stdout_writer.rb von setting sync to true auf $stdout erwarten sind:

$stdout.sync = true 
Verwandte Themen