導入
nginx や postgres のようなプログラムは、ディスクに置かれた「ファイル」の状態ではただの部品です。それがメモリに読み込まれ、CPU で実行されている状態を プロセス と呼びます。サーバーで「何が動いているか」を語るとき、その単位が常にプロセスです。
説明
プログラム(ファイル)とプロセス(実行中の姿)の違いは、レシピと料理の関係に似ています。レシピ(プログラム)は1つでも、そこから作られる料理(プロセス)は同時に何皿もありえます。
flowchart LR
F["/usr/sbin/nginx<br/>(ディスク上のプログラム)"] -->|起動| P1["プロセス PID 640<br/>(メモリで実行中)"]
F -->|起動| P2["プロセス PID 641<br/>(別の実行中)"]
すべてのプロセスには、区別のための番号 PID(プロセスID) が付きます。そして各プロセスは、必ず「自分を起動した親」を持ち、全体が 1本の木(ツリー) になっています。根っこは PID 1 の init(systemd)——サーバー起動時に最初に立ち上がり、他のすべての先祖になる特別なプロセスです。
flowchart TD
init["/sbin/init (systemd)<br/>PID 1 ― すべての先祖"]
init --> sshd["sshd<br/>PID 420"]
init --> pg["postgres<br/>PID 512"]
init --> nginx["nginx<br/>PID 640"]
sshd --> bash["-bash(あなたのシェル)<br/>PID 1024"]
bash --> ps["ps(今打ったコマンド)<br/>PID 1180"]
あなたが打つコマンドも、実はプロセスです。シェル(bash)が親になって、ps や grep を子プロセスとして起動し、終わると消えます。第4章のパイプ | は、複数のプロセスを同時に起動して出力をつなげていたのです。
プロセスには状態もあります。実行中(Running)、待機中(Sleeping)、一時停止(Stopped)など。CPU をほぼ100%使い続けているプロセスは「暴走」を疑います——これを見つけて止めるのが、次のレッスン群のテーマです。
「サーバーが重い」「サービスが応答しない」といったトラブルは、ほぼ必ず「どのプロセスが原因か」を突き止めるところから始まります。だから運用者は、まず
psやtopでプロセスを見るのです。
この章のまとめ
- プロセス=メモリに読み込まれ実行中のプログラム。ディスク上のファイルとは別
- 各プロセスは PID を持ち、親子のツリー(根は PID 1 の systemd)をなす
- あなたが打つコマンドもプロセス(シェルが親)
- トラブル調査は「どのプロセスが原因か」を突き止めることから始まる