2012-03-30 56 views
0

我有一個簡單的腳本:ruby​​文件輸出叉

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 

當工作,所有輸出被緩衝,並通過大PICES寫入/tmp/log(?) 。

$stdout.puts "MESSAGE" 
$stdout.flush 

我如何可以做同樣的沒有修改script.rb
如果我修改劇本這僅適用?
謝謝。

回答

1

當您撥打exec時,您將創建一個新進程,儘管此進程繼承了您設置爲標準輸出的文件,但不會繼承其他設置,特別是同步設置。

爲了在新進程中獲得無緩衝輸出,您需要在該進程中進行設置。如果你不希望修改script.rb一個解決辦法可能是創建另一個文件,命名爲somethig像sync.rb只包含:

STDOUT.sync = true 

其運行的命令時,你就可以要求:

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

的新的Ruby進程現在需要sync.rb,它只需在執行腳本之前將STDOUT上的同步模式設置爲true。