Javascript 当输出以ruby打印到标准输出时,如何使用回调

Javascript 当输出以ruby打印到标准输出时,如何使用回调,javascript,ruby,node.js,spawn,Javascript,Ruby,Node.js,Spawn,我正在编写脚本来监视服务器状态。 我可以用javascript编写代码,但必须用ruby编写 在javascript中,可以像这样使用node.js来完成 var iostat=require('child_process')。spawn(“iostat”,[“-w1]”); iostat.stdout.on('data',函数(data){ 控制台日志(数据); }); 此代码每秒执行iostat命令并输出到控制台。 如何在ruby中实现同样的功能? 换句话说,我想在用ruby打印stdou

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

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

var iostat=require('child_process')。spawn(“iostat”,[“-w1]”);
iostat.stdout.on('data',函数(data){
控制台日志(数据);
});
此代码每秒执行iostat命令并输出到控制台。 如何在ruby中实现同样的功能?
换句话说,我想在用ruby打印stdout时使用callback。

可能有更好的方法,但您可以这样做:

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)> 
pry(主)>模块定位器
撬(主)*def puts(串)
撬(主)*超级(“***{string}***”)
撬(主)*端
撬(主)*端
=>零
撬(主)>$stdout.extend PutsWatcher
***=> #
***
撬动(主)>放置“yo”
***哟***
***=>零
***
撬动(主)>

顺便说一下,我不是建议你这么做。。。修补核心类通常是个坏主意。我提到它纯粹是为了学术目的。

事实上,我并不是有意这样做的。例如,如果我像这样编写代码,
放入'iostat-w1'
我永远不会得到结果,因为iostat会继续输出。但是,我希望每秒都能得到结果,然后每次都不断地处理它。