2014-01-07 219 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脚本将按预期工作,不会在每次打印后进行刷新。 –