代码之家  ›  专栏  ›  技术社区  ›  Mark Ramasco

无法获取从节点子进程派生的无限运行Ruby应用程序的输出

  •  0
  • Mark Ramasco  · 技术社区  · 7 年前

    我正试图围绕现有的ruby命令行应用程序编写一个带有节点和电子的GUI。我发现了一个示例,如何通过执行以下操作从子进程获取输出:

    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);
    });
    

    还有孩子。js看起来像这样

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

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

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

    这就是ruby代码

    while true
        sleep 2
        puts 'test'
    end
    

    我没有得到任何输出。这似乎取决于输出。我希望看到每2秒打印一次“测试”。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Amadan    7 年前

    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上工作,因此缓冲行为不同。。。我不知道。。。