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。!」
デビー君「あ。誤魔化したな?」