プロセスとシグナル

INPUT · スライド

動いているものを見る(`ps`)

01 / 08

打ったコマンドはどこへ行ったのか

ここまで、コマンドを打つと結果が返ってきたよね。

~ $ lsmemo.txt~ $

あの一瞬のあいだに何が起きていたんだろう。ls というプログラムが起動して、仕事をして、終わったんだよ。

動いているプログラム1つ1つを プロセス と呼ぶよ。ls は速すぎて見えないけれど、たしかにプロセスとして立ち上がっていたんだ。

そして、いま動いているプロセスは ls だけじゃないよ。あなたのシェルも動いているし、あなたが何も打っていない時間にも、裏方のプログラムがいくつも動いている。

この章はその見えないものを見るところから始まるよ。

02 / 08

プロセスには番号が付く

起動したプロセスには、必ず番号が振られるよ。PID(process ID)と呼ぶんだ。

PID   USER     COMMAND    1 root     init   78 manabiya -sh

1番から順に振られて、終わったら返される。あとで出てくる「止める」「合図を送る」という操作は、全部この番号を相手にするんだ。

だから名前ではなく番号で指すよ。同じ名前のプログラムが3つ動いていることは普通にあるからね。sleep を3つ動かしたら、名前だけでは区別できないでしょう。

番号はそのときの動いているものに付く札だよ。プログラムのファイルに付いているのではなくて、動きだしたときに配られて、終わると返される。同じ ls を2回打てば、番号は2回とも違うよ。

03 / 08

ps で一覧を出す

一覧を出すコマンドは ps(process status)だよ。

~ $ psPID   USER     COMMAND    1 root     init    2 root     [kthreadd]   52 root     /sbin/syslogd -n   77 root     /usr/sbin/crond -f   78 manabiya -sh   84 manabiya ps

列は3つだよ。

意味
PID番号
USER誰が動かしているか
COMMAND何が動いているか

最後の行を見てほしいな。ps 自身が写っているよ。自分を数えるのに自分も並ぶのは変な感じだけれど、正しいんだ。ps を打った瞬間、ps もプロセスとして動いているからね。

これは覚えておくと後で役に立つよ。「1つあるはずが2つある」の1つは自分だった、ということがよくあるんだ。

04 / 08

角かっこはカーネルの中の人

一覧をよく見ると、名前が [...] で囲まれたものがたくさんあるよ。

    2 root     [kthreadd]    3 root     [pool_workqueue_]   14 root     [ksoftirqd/0]

これは カーネルスレッド だよ。Linux の核(カーネル)が自分のために動かしている働き手で、/bin にファイルがあるプログラムではないんだ。

角かっこは「これは中の人だから、あなたが起動したものではないよ」という印だと思ってね。ディスクの書き出しや、メモリの整理を裏でやってくれているよ。

この Linux では31本くらい動いているよ。数が多くて驚くけれど、ほとんど眠っていて CPU を使っていないんだ。

触らないほうがいいものだから、名前を覚える必要は無いよ。角かっこは飛ばして読む、それだけ知っておけば十分だからね。

05 / 08

-o で列を選ぶ

3列では足りないときは -o で選ぶよ。カンマで並べるんだ。

~ $ ps -o pid,ppid,user,argsPID   PPID  USER     COMMAND    1     0 root     init   78     1 manabiya -sh

選べる列はこれだけあるよ。

書く名前意味
pid番号
ppidの番号
user動かしている人
argsコマンドと引数
commコマンド名だけ
statいまの状態
vsz rss使っているメモリ

ppid の p は parent だよ。次のレッスンで詳しくやるけれど、プロセスには必ず親がいるんだ。

なお、この Linux の ps-o time-o nice を受け取れないよ。打つと ps: bad -o argument と出て、使える名前を教えてくれる。エラーが説明書になっているのが ps の親切なところだね。

06 / 08

$$ は自分のシェルの番号

いま自分が打っているシェルの番号は、$$ で分かるよ。

~ $ echo $$78

$$ はシェルが自分の番号に置きかえてくれる特別な書き方だよ(章10で仕組みをやるからね)。

組み合わせると、自分の行だけ取り出せるよ。

~ $ ps -o pid,ppid,args | grep "^ *$$ "   78     1 -sh

名前から番号を引く道具もあるよ。pidof だね。

~ $ pidof init1

番号 1 は特別だよ。Linux で最初に起動するプロセスで、この教材では init という名前になっている。すべてのプロセスは 1 から枝分かれしているんだ。次のレッスンの主役だよ。

07 / 08

grep で絞ると、grep が写る

一覧が長いときは grep で絞るよね。ところが困ったことが起きるんだ。

~ $ ps -o pid,args | grep sh   78 -sh   91 grep sh

grep sh の行が混ざっているよ。grep も1つのプロセスなので、ps に写ってしまうんだ。1つ数えたいのに2つ出る、という間違いのもとだね。

昔からある回避のしかたがあるよ。

~ $ ps -o pid,args | grep "[s]h"   78 -sh

[s]h は正規表現で「s のどれか1文字、そのあと h」という意味だから、sh に当たるよ(章3でやった文字クラスだね)。

でも grep 自身のコマンド行に写る文字は [s]h という4文字で、そこに sh の並びは無い。自分だけがすり抜ける形になっているんだ。

見た目は呪文だけれど、意味は単純だよ。仕組みが分かると忘れないでしょう。

08 / 08

さあ、打ってみよう

この回で使う道具はこれだけだよ。

ps                       一覧を出すps -o pid,ppid,user,args 列を選ぶpidof 名前               名前から番号を引くecho $$                  自分のシェルの番号

結果は数が多いから、ファイルに残してから読む問題が多いよ。章4で覚えた > と、章3で覚えた grep がそのまま使えるからね。

ひとつ注意だよ。番号は毎回変わる。あなたの画面に出る番号は、この教材に書いてある番号とは違うからね。それが正しいよ。

だから問題は「番号がいくつか」ではなく、「何が動いているか」「親は誰か」を確かめる形にしてあるよ。