2006-08-03

ps + grep の Tips

Linux でプロセスごとの実メモリー使用量 (RSS) を調べるのに、ps と grep を使う方法を先日書いた。

sawfish の RSS を調べるには、ps alx | head -1 && ps alx | grep sawfish とするんだったね。実行結果は次のようになる。

F   UID   PID  PPID PRI  NI   VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
0   666  3173  3147  15   0 11596 4976 -      S    ?          1:16 sawfish
0   666  4185  1733  23   5  5708  716 -      RN   pts/507    0:00 grep sawfish

この方法の欠点は、grep しているプロセス自身も引っかかってしまうこと (上例の最下行)。これは、見苦しいね。

この件について、OKAMURA さんが、コメントでアドバイスを下さった。ここに引用しやう。

s + grep で目的のプロセスだけの情報を抜き取るとき

grep sawfish

ではなく

grep [s]awfish

とすると grep の情報が出ないので便利ですよ。

ぼくの環境だと、[] が zsh に展開されてしまうので、grep "[s]awfish" とする必要があったけど、いいこと教えて頂いた。OKAMURA さん、ありがとう。

shell script psl

さて、複数プロセスのメモリ使用量を調べる場合、コマンドラインがちょっと複雑になる。そこで、psl なる shell script を組んでみた。次のようにして使う。

$ psl firefox emacs
F   UID   PID  PPID PRI  NI   VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
0   666 12520  3179  25   5  5116  952 wait4  SN   pts/14     0:00 /bin/sh /usr/local/bin/firefox/firefox
0   666 12523 12520  26   5  6356  1112 wait4 SN   pts/14     0:00 /bin/sh /usr/local/bin/firefox/run-mozilla.sh /usr/local/bin/firefox/firefox-bin
0   666 12528 12523  20   5 363576 173512 -   SN   pts/14    20:18 /usr/local/bin/firefox/firefox-bin
0   666 23237  3179  20   5 56436  50380 -    SN   pts/14   107:12 emacs

ソース・コードは下記:

#!/bin/sh

ps='ps alx'
psl=$0
$ps | head -1
for i in $*
do  command='['${i:0:1}']'${i:1}
  $ps | grep -v $psl | grep $command
done

${var:1} は変数 $var から文字を切り出す bash の組み込み機能。${変数名:切り取り開始:切り取り終了} という書式。開始位置は 0 から数える。「切り取り終了」は省略可能。つまり、$var=foo なら ${var:1}oo を返す。${var:0:1} なら、f を返す。

No comments:

Post a Comment