プロセスを確認する
いま動いているプログラムは「プロセス」として管理され、それぞれにPID(プロセス番号)が付きます。ps で一覧を取得し、top でCPUやメモリの使用状況をリアルタイムに眺め、応答しなくなったプロセスは kill にPIDを渡して終了させます。
ファイルは「置かれているもの」だったが、ここからは「動いているもの」を扱う。コンピュータの上では、いつも複数のプログラムが同時に動いている。
その「動いている実体」を、Linuxはプロセスという単位で捉える。
プログラムが起動するとメモリ上に専用の領域が確保され、そこに実行コードと作業用のデータが置かれる。ディスクに置かれたプログラムファイルが「レシピ」だとすれば、それを実際に調理している最中の状態がプロセスにあたる。
だから同じプログラムを2つ起動すれば、それぞれに別の領域が割り当てられ、別個のプロセスとして扱われる。
応答しなくなったアプリを止めたり、負荷の原因を突き止めたりするには、まずこのプロセスを見たり操作したりできることが出発点になる。
🔢 プロセスを名指す PID
プロセスを操作したいとき、最初の問題は「どれを相手にするか」をどう指定するかだ。その答えが PID(Process ID、プロセス番号)で、各プロセスには起動時に重複しない番号が割り振られる。
プロセスを操作するコマンドは、ほぼ例外なくこの PID で対象を指定する。
注意したいのは、PID はプロセスを起動するたびに新しく振られ、同じプログラムでも実行のたびに値が変わることだ。だから「いま動いているこのプロセスの番号はいくつか」をその都度調べてから操作する、という流れになる。
なお、システム起動時に最初に立ち上がるプロセスには PID 1 が与えられ(systemd などの初期化プロセス)、他のすべてのプロセスはそこから派生していく。
プロセスにはそれを起動したユーザ(所有者)の情報も結び付いており、原則として自分が起動したプロセスだけを自分で操作できる。
他人のプロセスを勝手に止められないこの仕組みも、ファイルのパーミッションと同じく、マルチユーザ環境を安全に保つための設計だ。
📋 いま動いているものを一覧する ps
操作の前に、まず何が動いているかを見なければ始まらない。動いているプロセスを一覧表示するのが ps コマンドだ。
引数なしの ps では、自分がいまのターミナルから起動したプロセスだけが、PID・端末・実行時間・コマンド名とともに簡潔に表示される。だがこれだけでは、裏で動いているものが見えない。
システム全体を見たいときは ps aux という組み合わせが定番だ。a(端末から起動した全プロセス)・u(所有者やCPU・メモリ使用率などの詳細)・x(端末を持たないプロセスも含める)を合わせることで、稼働中のすべてのプロセスを詳しい情報付きで一覧できる。
出力が膨大になるので、実務では ps aux | grep 名前 のようにパイプと grep で目当てのプロセスだけ絞り込むのが常套手段だ。
一覧を出せても、各列の意味が読めなければ宝の持ち腐れになる。
USER は所有者、PID はプロセス番号、%CPU と %MEM はCPUとメモリの使用率(高いほど負荷が大きい)、TTY は起動元の端末、STAT は状態、COMMAND は実行中のコマンド名だ。
とくに STAT の先頭1文字が読み解きの勘どころになる。R は実行中(または実行可能)、S はスリープ(イベント待ちで休止中)、T は停止中、Z はゾンビ(すでに終了したのに後始末が済んでいない状態)を表す。
たとえば %CPU が極端に高く STAT が R のまま張り付いているプロセスは、暴走を疑う手がかりになる。ゾンビが大量に残っている場合は、親プロセス側の不具合を疑う。
📊 いま何が重いのかを追う top
ps には弱点がある。実行した瞬間のスナップショットしか撮れないことだ。刻一刻と変わる負荷を追いたいときは top を使う。
画面を一定間隔で更新し続け、CPUやメモリの使用状況をリアルタイムに観察できる。負荷の高いプロセスが上位に並ぶよう自動で並び替わるため、「いま何が重いのか」を即座に把握するのに向く。
画面上部にはシステム全体のCPU使用率やメモリの空き、ロードアベレージ(混み具合の指標)も表示される。
システムが急に重くなったときは、まず top を開いて、どのプロセスがCPUやメモリを食い潰しているかを確認する、という使い方が基本だ。
表示中に大文字の M を押すとメモリ使用量順、P を押すとCPU使用量順に並べ替えられ、原因の切り分けに役立つ。top の表示は q キーで終了する。より見やすく操作しやすい htop という改良版が入っていることもある。
🛑 暴走したプロセスを止める kill
原因のプロセスを見つけたら、最後は止める段だ。応答しなくなったプロセスや、資源を消費し続ける有害なプロセスは、kill コマンドで終了させる。
書式は kill PID で、ps や top で調べた PID を渡す。
kill という名前から「強制的に殺す」印象を受けるが、実態は少し違う。プロセスに「シグナル」という合図を送るコマンドなのだ。
何も指定しないと既定で15番(SIGTERM)が送られ、これは「後片付けをしてから終了してください」という穏やかなお願いになる。
プログラムは開いているファイルを閉じたり、データを保存したりといった終了処理を済ませてから自分で終了できるため、まずはこの既定の kill を試すのが作法だ。
その穏やかなお願いが効かないときは、シグナル番号を明示して試す。
kill -2 PID は Ctrl + c と同じ割り込み、最終手段が kill -9 PID(SIGKILL)だ。-9 はカーネルがプロセスを問答無用で打ち切る。
確実に止まる反面、後片付けの機会を与えないため、書きかけのデータが壊れる恐れがある。だからこそ、いきなり -9 を使うのではなく「まず15、それでも駄目なら9」という順番が大切になる。
なお、他のユーザのプロセスを止めるには sudo kill PID のように管理者権限が必要だ。
関連して、システムのメモリが枯渇すると、カーネルが自動でプロセスを強制終了して全体を守ることもある(OOM killer)。アプリが理由もなく落ちていたら、こうした仕組みやログを疑う視点も持っておくとよい。
プロセスを正しく見て、状態を読み、適切なシグナルで止める。この一連の流れが、トラブル対応の土台になる。