1

topの結果をrubyプログラムに取り入れようとしています。ただし、トップは、ルビーからサブシェルで呼び出された場合と、シェルで直接実行された場合とでは動作が異なります。具体的には、rubyから実行したときに多くの結果を除外します。

たとえばtop -bn1 | wc -l、bashで実行すると「133」が返されます。backticksを使用してirbから同じコマンドを実行すると、「17」が返されます。

シェルからの呼び出しとサブシェルからの呼び出しに違いがあるのはなぜですか?ルビースクリプトでトップの完全な出力を取得するにはどうすればよいですか?

ノート

Ubuntu 12.04.1 LTS(正確)を実行しています。この問題は、まったく異なるバージョンのtopを提供するmacOSXでは発生しません。

「-d」遅延フラグを使用しても、動作は変わらないようです。また、反復回数を増やすこともありません。

psがtopと同じ統計の多くを返すことは知っていますが、計算方法が異なるtopのCPU使用率の見積もりに特に関心があります。

4

1 に答える 1

3

どうやら、topルビー内で実行するときの端末のサイズを尊重しています。あなたの端末サイズは 17 行の高さに違いありません。ENV ハッシュの LINES エントリを削除してみてください。

$ irb
irb(main):001:0> %x{top -bn1 | wc -l}
=> "36\n"
irb(main):002:0> ENV.delete 'LINES'
=> "36"
irb(main):003:0> %x{top -bn1 | wc -l}
=> "169\n"

実行中のプロセスの数を知りたい場合は、Ruby から次のように記述できます。

num = Dir.glob('/proc/*').select {|d| File.directory? d and d.match(/\/\d+$/)}.length

CPU 使用率については、おそらく次のようになります。

idle = %x{vmstat 1 2}.split[-2].to_i
usage = 100 - idle
于 2013-01-04T22:25:04.353 に答える