今回はコマンドを実行した後で
「何が起きているのか」を
覗いてみよう!
言われてみると
どんな仕組みなんだろうね?
Linux 上のプログラムは
「プロセス(process)」という
単位で動いているよ
1コマンドが
1プロセスに
なるのかな?
その場合がほとんどだけど
そうとも限らないんだ
例えば並列処理の場合は
1コマンドで複数のプロセスが
動くこともあるよ
データのまとまりの単位が
「ファイル」だとしたら
プログラムの動きの単位が
「プロセス」なんだね
ps コマンドps で
プロセスを確認できるよ
process の略なんだ
ps [オプション]...
| オプション | 役割 |
|---|---|
-e | 詳細情報を表示 |
-f | 自分が動かしていないプロセスも表示 |
ここでは
-e オプションを指定して実行しよう!ps -e
うん!
UID PID PPID C STIME TTY TIME CMD
midori 5173 5172 0 09:28 pts/0 00:00:00 -bash
midori 5632 5173 0 13:00 pts/0 00:00:00 ps -f
この中で注目して欲しいのは
PID, PPID, CMD の3つだよCMD は「コマンド」の略で プロセスを動かしているプログラムの名前だね
CMD はすぐにわかるね!
PID は「プロセスID(process ID)」の略で プロセスを一意に識別する番号なんだ
なるほど!
sleep のプロセスが複数動いていてもPID でそれぞれを区別できるんだね!似たような名前にPPID があるね?
PPID は「親プロセスID(parent process ID)」の略だよ プロセスは親子関係があって親プロセスの PID が PPID になるんだ
プロセスに親子関係があるってどういうこと?
プロセスは「フォーク(fork)」という 仕組みで作られるんだ以下のような流れになるよ
- 元になるプロセス(親プロセス)が動いている
- 新しいプロセスを作るとき、
親プロセスを 「コピー」 する - コピーされたプロセスは、
用途に応じて内容が書き換えられる - 書き換えられたプロセスは、
元のプロセスの 「子プロセス」 になる
なるほど!シェルからコマンドを実行する場合そのコマンドはシェルの子プロセスになるんだね!
飲み込みが早いねさっきの
ps の出力のps -f の PPID とbash の PID を見比べてみてごらんあっ!同じ
4172 だ!ということは ps -f の親プロセスは bash なんだねpstree コマンドでも
ps で PID と PPID を照らし合わせて探すのは大変だよ…もっと簡単に親子関係を見られないのかな?pstree はプロセスの親子関係をツリー形式で表示するよpstree [オプション]... [PID|ユーザ名]
pstree でプロセスの親子関係を見てみよう!pstree
どれどれ?
systemd─┬─ ...
...
├─sshd───sshd───sshd───bash───pstree
...
本当だ!
bash の子どもとしてpstree が表示されたよこれなら親子関係が一発でわかるね!今回はプログラムの動作単位「プロセス」と プロセス確認コマンド
ps, pstree を学んだよ!でも…プロセスの親子関係は何のためにあるのかな?
プロセスを効率的に管理するためなんだこの話をすると長くなりそうだから次回のプロセスを管理するコマンドで説明するね!