2

サーバーの状態を監視するためのスクリプトを書いています。コードは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で同じことをどのように実装できますか? つまり、stdout が ruby​​ で印刷されたときにコールバックを使用したいのです。

4

1 に答える 1

1

これを行うにはおそらくより良い方法がありますが、次のようなことができます。

module PutsWatcher
  def puts(string)
    super("***#{string}***")
  end
end

$stdout.extend PutsWatcher

puts "here"
# => "***here***"

IRB や Pry でこれを行うと少し奇妙になります。なぜなら、それらは独自の出力の上に (つまり、nil実行後にputs) 出力を生成するからですが、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)> 

ところで、これを勧めているわけではありません... コア クラスにパッチを適用することは、一般的に悪い考えです。純粋に学術的な目的で言及しています。

于 2011-10-22T14:26:25.503 に答える