本文へスキップ
BecomeCoder

サーバーコース · 第2章 サービスとプロセス · レッスン5

プロセスとは ― サーバーで動く「実行中のプログラム」

ローカル実施

導入

nginxpostgres のようなプログラムは、ディスクに置かれた「ファイル」の状態ではただの部品です。それがメモリに読み込まれ、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)が親になって、psgrep子プロセスとして起動し、終わると消えます。第4章のパイプ | は、複数のプロセスを同時に起動して出力をつなげていたのです。

プロセスには状態もあります。実行中(Running)、待機中(Sleeping)、一時停止(Stopped)など。CPU をほぼ100%使い続けているプロセスは「暴走」を疑います——これを見つけて止めるのが、次のレッスン群のテーマです。

「サーバーが重い」「サービスが応答しない」といったトラブルは、ほぼ必ず「どのプロセスが原因か」を突き止めるところから始まります。だから運用者は、まず pstop でプロセスを見るのです。

この章のまとめ

  • プロセス=メモリに読み込まれ実行中のプログラム。ディスク上のファイルとは別
  • 各プロセスは PID を持ち、親子のツリー(根は PID 1 の systemd)をなす
  • あなたが打つコマンドもプロセス(シェルが親)
  • トラブル調査は「どのプロセスが原因か」を突き止めることから始まる