2012-03-30 16 views
0

ich ein einfaches Skript haben:Ruby-Datei Ausgabe von Gabel

fork do 
    STDOUT.reopen(File.open('/tmp/log', 'w+')) 
    STDOUT.sync = true 
    exec 'bundle exec ruby script.rb' 
end 

script.rb:

loop do 
    sleep 1 
    puts "MESSAGE" 
end 

Wenn es funktioniert, werden alle Ausgänge puffert und schreibt an /tmp/log von großen pices (?) .
Es funktioniert nur, wenn ich Skript ändern:

$stdout.puts "MESSAGE" 
$stdout.flush 

Wie kann ich die gleiche tun, ohnescript.rb modifizieren?
Danke.

Antwort

1

Wenn Sie exec aufrufen, erstellen Sie einen neuen Prozess, und obwohl dieser Prozess die Datei übernimmt, die Sie als Standard festlegen, erbt er nicht die anderen Einstellungen, insbesondere die Synchronisierungseinstellung.

Um die ungepufferte Ausgabe im neuen Prozess zu erhalten, müssen Sie sie in diesem Prozess einstellen. Wenn Sie nicht wollen, script.rb eine Abhilfe ändern, könnte eine andere Datei mit dem Namen somethig wie sync.rb enthält nur zu schaffen sein:

STDOUT.sync = true 

die Sie dann benötigen, wenn Ihr Befehl ausgeführt wird:

exec 'bundle exec ruby -r./sync script.rb' 

Die Für den neuen Ruby-Prozess ist jetzt sync.rb erforderlich, wodurch der Synchronisierungsmodus auf STDOUT einfach auf true festgelegt wird, bevor das Skript ausgeführt wird.