【问题标题】:How can I use callback when output was printed to stdout in ruby在 ruby​​ 中将输出打印到标准输出时如何使用回调
【发布时间】:2011-12-13 04:34:17
【问题描述】:

我正在编写用于监视服务器状态的脚本。 我可以用javascript编写代码,但我必须用ruby编写。

在javascript中,可以像这样使用node.js来完成。

var iostat = require('child_process').spawn("iostat", ["-w 1"]);
iostat.stdout.on('data', function (data) {
    console.log(data);
});

此代码每秒执行一次 iostat 命令并输出到控制台。 如何在 ruby​​ 中实现相同的功能? 换句话说,我想在 ruby​​ 中打印 stdout 时使用回调。

【问题讨论】:

    标签: javascript ruby node.js spawn


    【解决方案1】:

    可能有更好的方法来做到这一点,但你可以这样做:

    module PutsWatcher
      def puts(string)
        super("***#{string}***")
      end
    end
    
    $stdout.extend PutsWatcher
    
    puts "here"
    # => "***here***"
    

    如果您在 IRB 或 Pry 中执行此操作会有点奇怪,因为它们自己产生输出,在您自己之上(即您执行 puts 之后的 nil),但这里是 pry 的复制/粘贴:

    pry(main)> module PutsWatcher
    pry(main)*   def puts(string)
    pry(main)*     super("***#{string}***")
    pry(main)*   end
    pry(main)* end
    => nil
    pry(main)> $stdout.extend PutsWatcher
    ***=> #<IO:<STDOUT>>
    ***
    pry(main)> puts "yo"
    ***yo***
    ***=> nil
    ***
    pry(main)> 
    

    顺便说一句,我不建议您这样做...修补核心类通常是个坏主意。我只是出于学术目的提及它。

    【讨论】:

    • 其实我不是故意的。例如,如果我这样编写代码,puts 'iostat -w 1' 我永远不会得到结果,因为 iostat 继续输出。但是,我想每秒得到结果,然后每次连续处理。
    猜你喜欢
    • 2013-05-01
    • 2011-09-14
    • 1970-01-01
    • 2016-03-04
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多