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コマンド!」