2014-01-07 82 views
0

對於我的一個項目,我基本上希望能夠將一個命令傳遞給一個Node.js腳本並讓它執行它並逐行記錄輸出。這就是我現在所擁有的:Node.js子進程產生緩衝問題?

var child_process = require('child_process'); 
var child_spawn = child_process.spawn('ruby', ['test.rb']); 

child_spawn.stdout.on('data', function(data) { 

    console.log('stdout: ' + data); 

}); 

現在,當我尾-f系統記錄該工程,我會除外,但是當我用一個簡單的Ruby腳本我寫測試它一次爲臨危所有輸出如果它被緩衝?

腳本中的問題是:

puts "hello" 
sleep(1) 
puts "there" 
sleep(1) 
puts "my" 
sleep(1) 
puts "name" 
sleep(1) 
puts "is" 
sleep(1) 
puts "james" 

當我在它自己的運行這個它的作品,因爲我敢肯定,你可以想像,在與之間的第二間隙的時間打印出一條線。

在節點文檔(http://nodejs.org/api/child_process.html)我看到這一點:

(請注意,某些程序使用行緩衝I/O內部不影響Node.js的,但它意味着你要發送的數據孩子的過程不會立即消耗。)

這是發生在這裏,有沒有辦法解決它?

回答

0

vkurchatkin's(https://stackoverflow.com/a/20978696/483271)答案正確地解釋了爲什麼發生這種情況的原因。

我怎樣才能解決這個問題,但是通過使用這個https://github.com/chjj/pty.js/(在npm上可用),它允許模擬一個終端,所以Ruby不會緩衝它的輸出,並且似乎有一個兼容的API來處理我的child_process到目前爲止已經看到。

1

這正是發生的情況。檢查:

puts "hello" 
STDOUT.flush 
sleep(1) 
puts "there" 
STDOUT.flush 
sleep(1) 
puts "my" 
STDOUT.flush 
sleep(1) 
puts "name" 
STDOUT.flush 
sleep(1) 
puts "is" 
STDOUT.flush 
sleep(1) 
puts "james" 
STDOUT.flush 

我認爲紅寶石檢測是否粗壯是不是tty,以及腳本退出時若有緩存所有的輸出和刷新。把STDOUT.sync = true似乎解決了這個問題。

+0

啊有趣的是,這確實在技術上解決它。問題出在我的情況下,我並不總是能夠控制腳本/命令,所以我不能做那樣的調整。我實際上已經設法使用類似https://gist.github.com/jamesrwhite/3369fa6c04a6e14fb3a8的方式讓它在Ruby中工作,並且test.rb腳本將按預期工作,不會在每次打印後進行刷新。 –