2011年12月24日土曜日

Windows で特定のアプリケーションのメモリ使用量を監視する - コマンドラインの tasklist とバッチファイル、Ruby を利用

1. 特定のアプリケーションのメモリの使用状況を手軽に把握したい

アドオンをたくさんインストールした状態で、Firefox を使っていると、メモリを大量に消費する。メモリの消費量が増えると、動作が緩慢になるので、メモリの使用状況を、逐次、確認しておきたい。

Firefox には、メモリの使用状況を表示してくれるアドオンがある。

また、メモリの状況を把握するなら、タスクマネージャを起動すれば良い。Process Lasso のようなプロセスを監視するアプリケーションにも、メモリの使用状況が、細かく表示される。

しかし、一つアプリケーションのメモリの使用状況だけを、監視したい目的には大げさすぎる。もっと、小さなウィンドウで表示させておきたい。

Firefox 以外のアプリケーションでも利用できるように、コマンドラインを利用することにした。

 

2. tasklist でタスクの状態を把握する

Windows のコマンドラインで、タスク一覧を表示させるコマンドは、

talklist

一覧の中から、特定のアプリケーションだけを表示させたい。

例えば、firefox だけを表示させたい場合、

/fi オプション

により、次のように指定する。

tasklist /fi "imagename eq firefox.exe"

書式については、help tasklist を参照。

コマンドを実行した結果は、以下のようになった。

イメージ名      PID セッション名     セッション# メモリ使用量
============= ======== ============= =========== ============
firefox.exe   9048 Console   1  1,003,824 K

プロセスの ID で抽出したい場合は、tasklist で一覧した後、目的の PID を覚えておく。

例えば、PID が 9048 の場合、次のようにコマンドを入力すれば良い。

tasklist /fi "PID eq 9048"

 

3. バッチファイルで定期的にコマンドを実行

1秒おきに、メモリの使用量を表示させたい場合、以下の内容のバッチファイル (task.bat) を作成し、実行。

@echo off
:LOOP
	tasklist /fi "imagename eq firefox.exe"
	sleep 1
	cls
goto :LOOP

 

4. Ruby のキャリッジリターンを使い、表示のチラツキを抑える

ただし、上記の方法では、更新されるたびに、画面がちらつく。

これに対処するためには、Ruby 初心者スレッド Part 46 - READ2CH によると、

176 + 1:デフォルトの名無しさん[sage] 2011/10/16(日) 21:39:16.43
clsはWindowsのcmd.exeのコマンドじゃまいか
一行だけクリアすればいいのなら
 
loop { print Time.now; sleep 1; print "\r" }
 
とかできるけど、数行とかそれ以上のことがしたいなら
Ruby向けのライブラリを探すかWindowsのコンソール用のAPIを
使うはめになるんじゃないだろうか

print メソッドにおける “\r” は、バックスラッシュ記法 によると、

\r

キャリッジリターン(0x0d)

キャリッジ・リターン - Wikipedia とは、

キャリッジ・リターン(carriage return)は本来、テレタイプ端末Baudot Code における制御文字を指す用語で、行末から行頭に戻す復帰コードであって、改行コードを含まない。…

コンピューティングでは、キャリッジ・リターン (CR) はASCIIUnicodeEBCDICにおける制御文字の一種で、プリンターまたは何らかの表示装置にカーソルを同一行の先頭位置に移動させる意味を持つ。

Ruby で、コマンドを実行するには、

コマンド出力 

バッククォート(`)で囲まれた文字列は、ダブルクォートで囲まれた文字列と同様にバックスラッシュ記法 の解釈と式展開 が行なわれた後、コマンドとして実行され、その標準出力が文字列として与えられます。

RubyInstaller for Windows などで、Ruby がインストール済みだとする。以下の内容を task.rb として、実行。

loop do 
    lines = `tasklist /fi "imagename eq firefox.exe "`.split("\n")
    line = lines[3].split
    print "#{line[0]}: #{line[4]}"
    sleep 1
    print "\r"
end

実行した後、ウィンドウの大きさを小さくしした。

img_0020

常にウィンドウを前面に表示し、監視するには、Dexpot を使いウィンドウを全面に表示させる機能を利用した。

 

参考サイト