今回はコマンドを実行した後で
「何が起きているのか」を
覗いてみよう!
言われてみると
どんな仕組みなんだろうね?
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 -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
を学んだよ!でも…プロセスの親子関係は何のためにあるのかな?
プロセスを効率的に管理するためなんだでもこの話をすると長くなりそうだから次回のプロセスを管理するコマンドで説明しよう