3秒でわかる
OSがメモリやCPUを割り当てて実行しているプログラムの単位。同じコマンドを2回動かせば別のプロセスになり、それぞれ独立したメモリ空間を持ちます。
もう少し詳しく
どういうものか
プロセスとは、ディスク上のプログラム(実行ファイル)が OS に読み込まれて実際に動いている状態のことです。OS はプロセスごとに専用のメモリ空間、開いているファイルの一覧、実行状態を管理し、PID という番号を割り当てます。
同じ python app.py を 2 つの端末で起動すれば、プログラムは 1 つでもプロセスは 2 つです。片方が変数を書き換えても、もう片方には影響しません。
なぜ必要か
もしすべてのプログラムが同じメモリを共有していたら、1 本のバグが他のすべてを巻き添えにします。プロセスという境界があるおかげで、異常終了した Web サーバーがデータベースを道連れにすることはありません。
サーバー運用でプロセスを理解していると、「重いのは誰のせいか」「なぜポートが使用中と言われるのか」「終了したはずのアプリがまだ動いているのはなぜか」を切り分けられます。Linux の障害対応で最初に見るのはたいていプロセスです。
具体例
ps aux | grep nginx # 動いているプロセスを探す
top # CPU 使用率の高い順に眺める
lsof -i -P -n | grep 8080 # ポート 8080 を掴んでいるプロセスを特定
kill 12345 # PID 12345 に終了を依頼する (SIGTERM)
kill -9 12345 # 応じない場合に強制終了する (SIGKILL)
systemctl status nginx # サービスとして管理されているプロセスの状態ps の出力で見える PPID は親プロセスの PID です。プロセスは必ず親から生まれ、init(systemd)を根とする木構造になっています。
つまずきやすいところ
kill -9 を使う — SIGKILL はプロセスに後始末をさせずに落とすため、書きかけのファイルやロックが残ります。まず kill(SIGTERM)で頼み、駄目なときだけ -9 にしますtop で見える使用率が 100% を超えるのは、複数のコアで複数スレッドが動いているためです似た用語との違い
| 用語 | 中身 | メモリ |
|---|---|---|
| プログラム | ディスク上のファイル。まだ動いていない | 持たない |
| プロセス | 実行中の実体。PID を持つ | 独立した空間を持つ |
| スレッド | プロセス内の実行の流れ | 同じプロセス内で共有する |
| ジョブ | シェルが管理する実行単位。jobs で見える | プロセスに紐づく |
覚え方
プログラムはレシピ、プロセスは実際に作っている料理と考えます。同じレシピから同時に 2 皿作れば、鍋も材料も別々です。