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

时间:2014-01-07 17:49:36

标签: 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);

});

现在,当我关闭系统日志时,这会像我一样工作,但是当我用一个简单的ruby脚本测试它时,我写了它立即收到所有输出,好像它是缓冲的一样?

有问题的剧本是:

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

当我自己运行它时,它确实可以想象,一次打印出一行,中间有第二个间隙。

在节点docs(http://nodejs.org/api/child_process.html)上,我看到了这一点:

  

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

这就是这里发生的事情吗?有办法吗?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

vkurchatkin(https://stackoverflow.com/a/20978696/483271)的答案正确地解释了为什么会发生这种情况的原因。

我实际上是如何使用这个https://github.com/chjj/pty.js/(在npm上可用),它允许模拟终端,因此Ruby不会缓冲它的输出,并且似乎有一个与child_process兼容的API从我到目前为止看到的。

相关问题