对于我的项目,我基本上希望能够将命令传递给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,但这意味着您发送到子进程的数据不会立即消耗。)
这就是这里发生的事情吗?有办法吗?
答案 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从我到目前为止看到的。