Javascript Node.js子进程产生缓冲问题?

Javascript Node.js子进程产生缓冲问题?,javascript,node.js,Javascript,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);

对于我的一个项目,我基本上希望能够将一个命令传递给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"
当我自己运行它的时候,它的工作原理正如我相信你们可以想象的,一次打印一行,中间有一个间隙

在节点docs()上,我看到了以下内容:

(请注意,某些程序在内部使用行缓冲I/O。这不会影响node.js,但这意味着您发送给子进程的数据不会立即被消耗。)


这就是这里正在发生的事情吗?有办法解决吗?

这正是发生的事情。选中此项:

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
我假设ruby检测stout是否不是tty,如果是,则缓冲所有输出并在脚本退出时刷新。放置STDOUT.sync=true似乎可以解决这个问题。

vkurchatkin()的回答正确地解释了发生这种情况的原因


然而,我实际上是如何解决这个问题的,就是通过利用这个(npm上提供的),它允许模拟终端,这样Ruby就不会缓冲它的输出,而且从我目前看到的情况来看,它似乎有一个兼容的API到child_进程。

啊,有趣的是,这在技术上解决了这个问题。问题是在我的情况下,我并不总是能够控制脚本/命令,所以我不能像那样进行调整。实际上,我使用类似这样的东西在Ruby中实现了这一点,test.rb脚本将按预期工作,每次打印后都不会刷新。现在无法使用,请使用此