Linuxゲリラ戦記

パイプを通してプロセスを次に渡せ。

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

14.パイプとgrep、less。

ナックス「さて、前にも言ったとおり、最終的にはフリーズしてしまったLinuxの直し方を教える予定です。というわけで、今日はgrepコマンドとか教えるぞ!」

デビー君「『グレップ』コマンド?なんだか、カエルのゲップみたいな名前だね」

ナックス「そうです。このカエルのゲップみたいなやつは、食べたものを吐き出すのです」

デビー君「吐き出す?」

ナックス「とりあえずウェブブラウザ(インターネットをするソフト)を起動してください」

デビー君「え?CUI環境じゃなくてウェブブラウザ?」

ナックス「そうです。今回は実行中のプロセスのプロセス番号を知る方法を学びたいと思います。多くのLinuxユーザーの人はfirefoxだと思います。operaのひともいるでしょう。iceweaselの人もいるでしょう。konquerorの人もいるかもしれません。とにかくそいつをさくっと起動してください」

デビー君「いや、でもこのサイトを見ている時点で何かしらのブラウザを起動しているとは思うけど……」

ナックス「あ、そうか。さて、ブラウザを起動したらいつも通りCUI環境も立ち上げましょう」

デビー君「はーい、立ち上げました」

ナックス「ではまず、ps auxコマンドを実行してみましょう」

$ ps aux

ナックス「実行結果は以下の様な感じですね」

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   1684   304 ?        Ss   09:37   0:00 ini    
root         2  0.0  0.0      0     0 ?        S<   09:37   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S<   09:37   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S<   09:37   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   09:37   0:00 [watchdog/0] 
root         6  0.0  0.0      0     0 ?        S<   09:37   0:00 [events/0]   
root         7  0.0  0.0      0     0 ?        S<   09:37   0:00 [khelper]    
root         8  0.0  0.0      0     0 ?        S<   09:37   0:00 [async/mgr]  
root         9  0.0  0.0      0     0 ?        S<   09:37   0:00 [kblockd/0]  
root        10  0.0  0.0      0     0 ?        S<   09:37   0:00 [kacpid]     
root        11  0.0  0.0      0     0 ?        S<   09:37   0:00 [kacpi_notify]
root        12  0.0  0.0      0     0 ?        S<   09:37   0:00 [kseriod]     
root        13  0.0  0.0      0     0 ?        S    09:37   0:00 [khungtaskd]  
root        14  0.0  0.0      0     0 ?        S    09:37   0:00 [pdflush]     
root        15  0.0  0.0      0     0 ?        S    09:37   0:00 [pdflush]     
root        16  0.0  0.0      0     0 ?        S<   09:37   0:01 [kswapd0]     
root        17  0.0  0.0      0     0 ?        S<   09:37   0:00 [aio/0]       
root        18  0.0  0.0      0     0 ?        S<   09:37   0:00 [crypto/0]    
root       375  0.0  0.0      0     0 ?        S<   09:37   0:00 [ata/0]       
root       406  0.0  0.0      0     0 ?        S<   09:37   0:00 [ata_aux]     
root       407  0.0  0.0      0     0 ?        S<   09:37   0:00 [scsi_eh_0]   
root       408  0.0  0.0      0     0 ?        S<   09:37   0:01 [scsi_eh_1]   
root       492  0.0  0.0      0     0 ?        S<   09:37   0:00 [kjournald]   
root       515  0.0  0.1   1972   224 ?        S<s  09:37   0:00 /sbin/udevd --daemon
root      1289  0.0  0.0      0     0 ?        S<   09:37   0:00 [ksuspend_usbd]     
root      1323  0.0  0.0      0     0 ?        S<   09:37   0:00 [khubd]       
root      1422  0.0  0.0      0     0 ?        S<   09:37   0:00 [pccardd]     
root      1474  0.0  0.0      0     0 ?        S<   09:37   0:00 [kpsmoused]         
root      1985  0.0  0.0      0     0 ?        S<   09:37   0:00 [phy0]        
root      2041  0.0  0.0      0     0 ?        S<   09:38   0:00 [kjournald]         
root      2278  0.0  0.0   4700    96 ?        S    09:38   0:00 supervising syslog-ng
root      2279  0.0  0.2   4880   640 ?        Ss   09:38   0:00 /usr/sbin/syslog-ng  
dbus      2288  0.0  0.3   2276   720 ?        Ss   09:38   0:00 /usr/bin/dbus-daemon --system
root      2302  0.0  0.1   1680   268 ?        Ss   09:38   0:00 /usr/sbin/acpid        
hal       2305  0.0  0.4   6072  1044 ?        Ss   09:38   0:00 /usr/sbin/hald         
root      2308  0.0  0.3  16332   852 ?        Ssl  09:38   0:00 /usr/sbin/console-kit-daemon 
root      2371  0.0  0.1   3164   324 ?        S    09:38   0:00 hald-runner            
root      2400  0.0  0.1   3228   380 ?        S    09:38   0:00 hald-addon-input: Listening on /dev/input/event1 /dev/input/
root      2417  0.0  0.1   3232   352 ?        S    09:38   0:01 hald-addon-storage: polling /dev/sr0 (every 2 sec)    
hal       2423  0.0  0.1   2924   272 ?        S    09:38   0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.so
root      2449  0.0  0.0   1872   100 ?        Ss   09:38   0:00 /sbin/dhcpcd -q eth0                
root      2465  0.0  0.1   1720   440 ?        S    09:38   0:00 /usr/sbin/crond                     
root      2529  0.0  0.1   2380   284 tty1     Ss   09:38   0:00 /bin/login --                       
root      2530  0.0  0.0   1684   212 tty2     Ss+  09:38   0:00 /sbin/agetty -8 38400 tty2 linux                
root      2531  0.0  0.0   1684   212 tty3     Ss+  09:38   0:00 /sbin/agetty -8 38400 tty3 linux                
root      2532  0.0  0.0   1684   212 tty4     Ss+  09:38   0:00 /sbin/agetty -8 38400 tty4 linux                
root      2533  0.0  0.0   1684   212 tty5     Ss+  09:38   0:00 /sbin/agetty -8 38400 tty5 linux                
root      2534  0.0  0.0   1684   212 tty6     Ss+  09:38   0:00 /sbin/agetty -8 38400 tty6 linux                
username  2536  0.0  0.1   5336   288 tty1     S    09:38   0:00 -bash                         
username  2539  0.0  0.1   5276   280 tty1     S+   09:39   0:00 /bin/sh /usr/bin/startx                   
username  2555  0.0  0.1   2956   292 tty1     S+   09:39   0:00 xinit /home/username/.xinitrc -- /etc/X11/xinit/xserverrc :0
root      2556 12.8 23.8  70868 52900 tty7     S<s+ 09:39   9:12 /usr/bin/X -nolisten tcp                  
username  2561  0.0  0.1   3320   252 tty1     S    09:40   0:00 ck-launch-session startkde                
username  2574  0.0  0.1   5280   280 tty1     S    09:40   0:00 /bin/sh /usr/bin/startkde                 
username  2609  0.0  0.1   4632   312 ?        Ss   09:40   0:00 /usr/bin/gpg-agent --daemon --pinentry-program /usr/bin/pine
username  2612  0.0  0.0   5752   112 ?        Ss   09:40   0:00 /usr/bin/ssh-agent -s                     
username  2623  0.0  0.1   3156   264 tty1     S    09:40   0:00 dbus-launch --sh-syntax --exit-with-session           
username  2624  0.0  0.4   2532   992 ?        Ss   09:40   0:03 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 
username  2630  0.0  1.0  57012  2268 ?        Ss   09:40   0:00 kdeinit4: kdeinit4 Running...
username  2631  0.0  1.8  58660  4004 ?        S    09:40   0:00 kdeinit4: klauncher [kdeinit] --fd=8
username  2633  0.0  8.7 104980 19324 ?        S    09:40   0:03 kdeinit4: kded4 [kdeinit]
username  2662  0.0  0.0   1668   116 tty1     S    09:40   0:00 kwrapper4 ksmserver
username  2663  0.0  1.6  88152  3704 ?        Sl   09:40   0:00 kdeinit4: ksmserver [kdeinit]
username  2665  0.1  3.8 247792  8556 ?        S    09:40   0:08 kwin
username  2667  0.0  1.4  80000  3220 ?        S    09:40   0:00 kdeinit4: kglobalaccel [kdeinit]
username  2669  0.3  7.1 268496 15864 ?        Sl   09:40   0:13 kdeinit4: plasma-desktop [kdeinit]
username  2671  2.4  1.8 102320  4068 ?        Sl   09:40   1:41 /usr/bin/knotify4
username  2674  0.0  0.5  31448  1156 ?        S    09:40   0:00 /usr/bin/kwrited
username  2676  0.0  1.4  79388  3216 ?        S    09:40   0:00 kdeinit4: kaccess [kdeinit]
username  2682  0.0  1.4  94992  3324 ?        Sl   09:40   0:00 kdeinit4: nepomukserver [kdeinit]
username  2684  0.0  2.9 249336  6636 ?        S    09:40   0:03 kdeinit4: krunner [kdeinit]
username  2687  0.0  1.8  45888  4072 ?        S    09:40   0:01 /usr/bin/nepomukservicestub nepomukstorage
username  2691  0.0  1.9  82680  4384 ?        S    09:40   0:00 kdeinit4: klipper [kdeinit]
username  2693  2.1  3.2  85320  7264 ?        S    09:40   1:28 kdeinit4: kmix [kdeinit]
username  2694  0.0  1.8  77536  4132 ?        S    09:40   0:00 /usr/bin/korgac -icon korgac
username  2695  0.0  1.2  40476  2748 ?        S    09:40   0:00 /usr/bin/nepomukservicestub nepomukontologyloader
username  2696  0.0  1.1  35572  2652 ?        S    09:40   0:00 /usr/bin/nepomukservicestub nepomukqueryservice
username  2697  0.0  1.1  40528  2648 ?        SN   09:40   0:00 /usr/bin/nepomukservicestub nepomukstrigiservice
username  2698  0.0  1.3  43748  3096 ?        Sl   09:40   0:00 /usr/bin/nepomukservicestub nepomukfilewatch
username  2699  0.0  1.1  35388  2612 ?        S    09:40   0:00 /usr/bin/nepomukservicestub nepomukmigration1
username  2788  0.0  2.8  28800  6400 ?        Ss   10:12   0:01 /usr/lib/scim-1.0/scim-launcher -d -c simple -e all -f socke
username  2792  0.0  0.2   5944   448 ?        Ss   10:12   0:00 /usr/lib/scim-1.0/scim-helper-manager
username  2793  0.1  3.2  28460  7312 ?        Ssl  10:12   0:02 /usr/lib/scim-1.0/scim-panel-gtk --display :0.0 -c socket -d
username  2795  0.1  0.8   9656  1868 ?        Ss   10:12   0:02 /usr/lib/scim-1.0/scim-launcher -d -c socket -e socket -f x1
username  2861  0.0  0.9  16004  2208 ?        Ss   10:17   0:00 /usr/lib/scim-1.0/scim-helper-launcher --daemon --config soc
username  2873  3.5 25.7 183584 57072 ?        Sl   10:18   1:09 kdeinit4: konqueror [kdeinit] --silent
username  2875  0.0  2.4  59244  5492 ?        S    10:18   0:00 kdeinit4: kio_file [kdeinit] file local:/tmp/ksocket-takahi
username  2904  0.0  4.8  82924 10672 ?        S    10:19   0:00 kdeinit4: kwalletd [kdeinit]
username  2931  2.0  9.4  97240 20924 ?        Rl   10:33   0:21 kdeinit4: konsole [kdeinit]
username  2933  0.0  0.7   5332  1764 pts/1    Ss   10:33   0:00 /bin/bash
username  2936  0.9  1.4   6844  3312 pts/1    S+   10:33   0:09 vi linux14.xhtml
username  2937  0.0  0.7   5332  1716 pts/2    Ss   10:50   0:00 /bin/bash
username  2938  0.0  0.4   4344  1016 pts/2    R+   10:50   0:00 ps aux

デビー君「相変わらず大量にプロセスがあるね」

ナックス「はい。Linuxがフリーズした場合、フリーズの原因は大体GUI環境での何かのプロセスです」

ナックス「そういう場合は以前に教えた『完全なCUI環境』を立ち上げて、psコマンドなどで原因のプロセスのプロセス番号を確認しつつ強制終了させ、フリーズしたGUI環境を直すことになります」

ナックス「しかし、実はこのps auxコマンド。GUI環境からのターミナルやコンソール(要するにCUI環境)では、横のバーを上下に動かすことで全体を見ることができますが、今まで何回かやった完全なCUI環境では横にバーがない。つまり、全体を見ることは不可能なんです。実行したら一瞬で実行された後、下の方の結果だけがなんとか見れるという状態」

デビー君「ふむふむ」

ナックス「しかし!プロセス番号を知らないと強制終了が行えません。そこで、まずはプロセスを食べます!」

デビー君「えーっと、『屏風(びょうぶ)にいる虎を見事捕らえてみせぃ!』っていう一休さんみたいなトンチ話?」

ナックス「いいえ。パイプを使うことでプロセスを食べることが出来るのです」

デビー君「パイプ?」

ナックス「パイプとは|という記号のことです。多分、Shiftキーを押しながら円マーク(またはバックスラッシュ)のキーを押せば出てきます」

デビー君「へー」

ナックス「しかし!プロセスは食べるだけではいけません。食べたら吐け!grepコマンドだ!今回私はkonquerorというブラウザを使っているので、こいつを吐き出す例を見せます!」

$ ps aux | grep konqueror

ナックス「すると、こんな感じの結果になります」

$ ps aux | grep konqueror
username  2873  2.0 16.7 181732 37180 ?        Sl   10:18   1:11 kdeinit4: konqueror [kdeinit] --silent
username  2949  0.0  0.3   4128   820 pts/2    S+   11:15   0:00 grep konqueror

ナックス「ちなみに、firefoxの人はこんなコマンドで」

$ ps aux | grep firefox

ナックス「iceweaselの人はこんなコマンドで」

$ ps aux | grep iceweasel

ナックス「operaの人はこんなコマンドでgrepを使います」

$ ps aux | grep opera

デビー君「うーん。結果が減ったのは分かるけど……?」

ナックス「『grep 文字列』で、その文字列が含まれた行だけを表示してくれます」

grep 文字列

デビー君「文字列?あ……!確かに、表示された結果にはkonquerorっていう文字が含まれてるね」

ナックス「そうです、『その一行にもし文字列が一つでも含まれていれば、その行を表示する』のがgrepです。先ほどの|(パイプ)と合わせて考えると『ps auxコマンドで出る結果表示を|で一度すべて食べて、grepで吐き出した』と表現することができます」

デビー君「『食べる』って凄まじい表現だなー」

ナックス「正式には|は『前のプロセスの結果を次のプロセスに渡すためのもの』です。grepは『何かしらの結果から、特定のキーワードが含まれた行だけを表示する』という性質上、|と一緒に使われるのが一般的です。先ほどの表示結果には2行の結果が表示されていましたが、よく見ると上はkdeinit4: konqueror [kdeinit] --silentと書かれていて、下はgrep konquerorつまり、現在行ったgrepコマンドの方の表示ということになります」

ナックス「ということは上の

username  2873  2.0 16.7 181732 37180 ?        Sl   10:18   1:11 kdeinit4: konqueror [kdeinit] --silent

の方が、ブラウザのプロセスの情報を表示していると推測出来るので『ブラウザのプロセス番号は2873だな』と判断することができます」

デビー君「へー」

デビー君「でも、今回はナックスの解説があるから良いものの、自分が実行中のプロセスの名前……例えば今回のkonquerorとか、他にもfirefoxとかiceweaselとかoperaとか、普通知らないよ。今回の例だとgrepの後にプロセスの名前を指定しないと、プロセスが特定できないんでしょ?それじゃあ初心者は手の出しようがないじゃないか」

ナックス「そんな場合の作戦その2。lessコマンド」

デビー君「『レス』コマンド?」

ナックス「CUI環境ではスライドバーが出ない。『じゃぁ、スライドバー無しで表示結果の上とか下とか見れるようにすれば文句ないだろ!』っていうのがlessコマンドです。こいつもパイプと一緒に使います。以下の様にコマンドを打ってみてください」

ps aux | less

デビー君「ん?ps auxコマンドの結果一覧が表示されてるね」

ナックス「↑キーや↓キーを押して見てください」

デビー君「あ!横のバーを使わずに↑キーと↓キーで上下を見れる!」

ナックス「はい。ちなみにlessコマンドを終えるにはqキー(大文字で言えばQキーのことです)を押してください」

ナックス「lessコマンドは完全なCUI環境でも使えます。確かに、事前にプロセスの名前を知らないとgrepコマンドを使うのは厳しいです。lessコマンドを使えば現在実行中のプロセスの正式名称が見られるので、プロセスの正式名称を知らない人でもある程度『さっきこんな感じの名前のプログラムを起動してたらLinuxがフリーズしちゃったから多分これが原因かな』と推理したりできます」

デビー君「なるほどー」

ナックス「今回は特定のプロセスのプロセス番号を知る方法を学びました。次回!Linuxのフリーズを直す。killコマンド!」