Linuxゲリラ戦記

リアルタイムにプロセスの状況が見たい。

左を向いているペンギンみたいなキャラクター、ナックス

13.topコマンドでリアルタイムにプロセスの状況を知る

ナックス「さて、本日は11.現在実行されているプロセスを表示。psコマンド

$ ps a

コマンドを実行した時に、

$ ps a
  PID TTY      STAT   TIME COMMAND
 2628 tty7     Ss+    5:18 /usr/X11R6/bin/X :0 -audit 0 -auth /var/lib/gdm/:0.Xauth -nolisten tcp vt7
 2776 tty1     Ss+    0:00 /sbin/getty 38400 tty1
 2778 tty2     Ss+    0:00 /sbin/getty 38400 tty2
 2782 tty3     Ss+    0:00 /sbin/getty 38400 tty3
 2786 tty4     Ss+    0:00 /sbin/getty 38400 tty4
 2788 tty5     Ss+    0:00 /sbin/getty 38400 tty5
 2790 tty6     Ss+    0:00 /sbin/getty 38400 tty6
 3278 pts/0    Ss     0:00 bash
 3338 pts/0    S+     0:02 vim linux11.xhtml
 3341 pts/1    Ss     0:00 bash
 3402 pts/1    R+     0:00 ps a

みたいな結果が出て、解説で『端末を持つ全てのプロセスの表示』と説明していましたが、本当に端末を持つプロセスが表示されているのかどうか確かめよう!みたいな感じの話をしたいと思います」

デビー君「はーい。プロセス名にtty1、tty2、tty3、tty4、tty5、tty6っていうのが表示されているけど、それぞれが12.これが本当のCUI環境だ!(コンソール・端末)で解説していた6つのCUI環境と対応している──!!と、名探偵の僕は推理してみました」

ナックス「はい。というわけで、実際に12.これが本当のCUI環境だ!(コンソール・端末)を参考にCUI環境を立ち上げて、その中でコマンドを実行してみてから、

$ ps a

を実行すれば、端末を持つプロセスが表示されるんじゃなかろうか、と思ってみたりする訳ですが、そうは問屋がおろさない!」

デビー君「え?何で?」

ナックス「psコマンドは『現在実行中のプロセス』の表示です」

デビー君「ふむふむ」

ナックス「仮に『CUI環境その1(tty1)』でpsコマンドを打ち──」

デビー君「へいへい」

ナックス「更に『CUI環境その2(tty2)』でpsコマンドを打ち──」

デビー君「ほーほー」

ナックス「でもってGUI環境に戻って

$ ps a

コマンドを打ってみても、『CUI環境その1』や『CUI環境その2』で打ったpsコマンドは表示されません」

デビー君「なんで?」

ナックス「なぜならpsコマンドは『現在実行中のプロセス』を表示するからです。『CUI環境その1』で打ったpsコマンドは、psコマンドを打った瞬間に実行され、そして直ぐに終了します。同じく『CUI環境その2』で打ったpsコマンドも、コマンドを実行した瞬間に直ぐに結果が表示されてから終了します。つまり、その後にGUI環境に戻って

$ ps a

コマンドを実行しても、先ほどのコマンドは既に終了してしまっているため、表示されないことになります」

デビー君「なるほどー。でも、コマンドって基本的に実行したら直ぐに終了しちゃうんでしょ?どうやって

$ ps a

が『端末を持つ全てのプロセスの表示』であることを確認するの?」

ナックス「はい。今回は『終了命令を出すまで実行し続けるコマンド』、topコマンドをお教えしたいと思います」

デビー君「topコマンド?」

ナックス「はい。こいつは凄いです。pstreeコマンドやpsコマンドは、『そのコマンドが実行された瞬間のプロセス』しか表示出来ませんでした。しかし、topコマンドはプロセスの状態をリアルタイムで表示し続けるのです。しかも、カッコいいです。初心者は『うおー!俺、何かハッカーみたい!』って思うことが出来ます!」

デビー君「へー!早速教えてよ!」

ナックス「以下のように使います」

$ top
$ top

top - 22:23:19 up  1:05,  3 users,  load average: 0.20, 0.22, 0.18
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
Cpu(s):100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    223888k total,   215872k used,     8016k free,    11324k buffers
Swap:  2441840k total,    42684k used,  2399156k free,    65952k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                 
    1 root      20   0  2100  712  616 S  0.0  0.3   0:01.06 init                                    
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                
    3 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0                             
    4 root      15  -5     0    0    0 S  0.0  0.0   0:00.08 ksoftirqd/0                             
    5 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0                              
    6 root      15  -5     0    0    0 S  0.0  0.0   0:00.96 events/0                                
    7 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 khelper                                 
   39 root      15  -5     0    0    0 S  0.0  0.0   0:00.06 kblockd/0                               
   41 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kacpid                                  
   42 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kacpi_notify                            
  112 root      15  -5     0    0    0 S  0.0  0.0   0:00.04 kseriod                                 
  149 root      20   0     0    0    0 S  0.0  0.0   0:00.06 pdflush                                 
  150 root      20   0     0    0    0 S  0.0  0.0   0:00.04 pdflush                                 
  151 root      15  -5     0    0    0 S  0.0  0.0   0:00.22 kswapd0                                 
  152 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 aio/0                                   
  613 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ksuspend_usbd                                 
  614 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 khubd                                   
  634 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ata/0                                   
  635 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ata_aux                                 
  804 root      15  -5     0    0    0 S  0.0  0.0   0:00.14 kjournald                               
  880 root      16  -4  3080 1676  488 S  0.0  0.7   0:00.32 udevd                                   
 1206 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 pccardd                                 
 1221 root      15  -5     0    0    0 S  0.0  0.0   0:14.98 ath5k_pci                               
 1323 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kpsmoused                               
 1354 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kgameportd                              
 1777 daemon    20   0  1892  504  416 S  0.0  0.2   0:00.00 portmap                                 
 1788 statd     20   0  1956  732  636 S  0.0  0.3   0:00.00 rpc.statd                               
 1984 root      15  -5     0    0    0 S  0.0  0.0   0:00.24 kondemand/0                             
 2032 root      20   0 27404 1456  976 S  0.0  0.7   0:00.02 rsyslogd                                
 2043 root      20   0  2292 1208  548 S  0.0  0.5   0:00.00 acpid                                   
 2090 messageb  20   0  2880 1144  816 S  0.0  0.5   0:00.32 dbus-daemon                             
 2105 avahi     20   0  2992 1240 1116 S  0.0  0.6   0:00.06 avahi-daemon

デビー君「うおー!何かよく分からんがスゲー!」

ナックス「そうです。何かよく分からんがスゲーのが見れます。これが、リアルタイムで動くプロセスの状況です。上に表示されているプロセスの方が、現在メモリを多く使っているという意味で、下に行くほど、メモリを使っていないプロセスと言う意味です。もちろんtopコマンドはGUI環境でもCUI環境でも使えます。ちなみに、topコマンドを終了したい場合は、キーボードのqキー(大文字で言えばQキー)を押します」

デビー君「つまり、『CUI環境その1』や『CUI環境その2』でtopコマンドを実行したまま、他のCUI環境やGUI環境で

$ ps a

を試せば、確かめられるっていうわけか!」

ナックス「そうです。早速『CUI環境その1』と『CUI環境その2』でtopコマンドを実行して、GUI環境(もしくは他のCUI環境)で

$ ps a

を試してみてください。ちなみに、私の場合は以下の様な結果になりました」

$ ps a
$ ps a
  PID TTY      STAT   TIME COMMAND
 2623 tty7     Ss+    4:41 /usr/X11R6/bin/X :0 -audit 0 -auth /var/lib/gdm/:0.Xauth -nolisten tcp vt7
 2805 tty1     Ss     0:00 /bin/login --         
 2806 tty2     Ss     0:00 /bin/login --         
 2809 tty3     Ss+    0:00 /sbin/getty 38400 tty3
 2812 tty4     Ss+    0:00 /sbin/getty 38400 tty4
 2814 tty5     Ss+    0:00 /sbin/getty 38400 tty5
 2816 tty6     Ss+    0:00 /sbin/getty 38400 tty6
 3022 pts/0    Ss+    0:00 bash
 3145 pts/1    Ss     0:00 bash
 3220 tty1     S      0:00 -bash
 3234 tty2     S      0:00 -bash
 3389 tty1     S+     0:00 top
 3390 tty2     S+     0:00 top
 3393 pts/1    R+     0:00 ps a

デビー君「下の方にtopコマンドが表示されてるね。ということは、どうやらTTYという項目(左から二つ目の項目)は『どの端末でプログラムが実行されているか』を表しているわけか……。あれ?ナックス、tty1とtty2にbashっていうプロセスが表示されてるけど……。bashって確かCUI環境のことだよね?今回は『CUI環境その1』と『CUI環境その2』にログインしたから、それぞれのbashプロセスが起動した……?もしかして、わざわざtopコマンドを実行しなくてもログインした時点で」

ナックス「次回!パイプとgrep、less。!」

デビー君「あ。誤魔化したな?」