无法从Node子进程生成的无限运行的Ruby应用程序获得输出

时间:2018-01-11 01:17:45

标签: node.js ruby electron child-process

我正在尝试使用Node和Electron围绕现有的ruby命令行应用程序编写GUI。我找到了一个如何通过执行以下操作从子进程获取输出的示例:

.image {
width: 50%;
height: auto;
}

.overlay {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin-left:auto;
margin-right:auto;
height: auto;
width: 50%;
opacity: 0;
transition: .5s ease;
background-color: rgba(0,0,0,0.65);
}

.hover-img:hover .overlay {
opacity: 1;
}

.text{
color: white;
font-size: 20px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
}

.nopadding{
padding:0 !important;
} 

而child.js看起来像这样

var spawn = require('child_process').spawn;

var child = spawn('node', ['child.js']);

child.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

这对我来说很好,但如果我尝试使用ruby应用程序切换到此

while(true) {
  console.log('blah');
}

这是红宝石代码

var child = spawn('ruby', ['test.rb']);

我没有输出。它似乎挂在输出上。我希望每2秒钟看一次“测试”。

1 个答案:

答案 0 :(得分:0)

Ruby不知道你想要立即输出,并为了提高效率而缓冲它。如果你使它刷新输出缓冲区(IO#flush),它就可以工作。

while true
    sleep 2
    puts 'test'
    STDOUT.flush
end

或者,您可以立即告诉Ruby您想要所有输出(IO#sync=):

STDOUT.sync = true
while true
    sleep 2
    puts 'test'
end

顺便提一下,你的原始代码适用于JRuby,所以缓冲行为有所不同......我不知道......