LinuxのプロセスID(PID)とは?仕組みと管理方法を初心者向けに徹底解説
生徒
「Linuxを使っていると『プロセス』とか『PID』という言葉をよく聞くのですが、これって何のことですか?」
先生
「簡単に言うと、Linuxの中で動いている『プログラム一つひとつに割り振られた背番号』のことですよ。」
生徒
「背番号ですか!それがあると、コンピュータはどう助かるんですか?」
先生
「たくさんのプログラムが同時に動いても、誰が何をしているか見分けるために必要なんです。基本からゆっくり説明しますね。」
1. プロセスとプロセスID(PID)の基本
Linuxの世界では、ブラウザを開いたり、ファイルをコピーしたり、コマンドを実行したりするたびに、裏側で「プログラム」が動いています。この実行中のプログラムのことを、Linuxでは「プロセス」と呼びます。
そして、コンピュータの中には同時に何百、何千というプロセスが存在しています。Linuxカーネル(OSの中核となる管理担当者)が、これら大量のプロセスを混乱せずに管理するために付ける識別番号が「プロセスID(PID:Process ID)」です。
例えば、学校の出席番号や、役所の受付票の番号をイメージしてください。名前が同じ「田中さん」が二人いても、番号が違えば別人だとわかりますよね。それと同じで、同じプログラムを二つ起動しても、それぞれに違うPIDが割り振られるため、Linuxは正確に区別できるのです。
2. プロセスの親子関係を知ろう
Linuxのプロセスには「親子関係」という面白い仕組みがあります。何かのプログラムが別のプログラムを起動したとき、元々のプログラムを「親プロセス」、新しく作られた方を「子プロセス」と呼びます。
このとき、子プロセスは自分の番号(PID)だけでなく、自分を生んだ親の番号も覚えています。これを「親プロセスID(PPID:Parent Process ID)」と言います。家系図のように、すべてのプロセスは辿っていくと、システムが起動したときに最初に作られる特別なプロセスに行き着きます。
もし親プロセスが終了してしまったのに、子プロセスだけが残ってしまうと「孤児プロセス」になります。また、仕事が終わったのにリストから消えずに残っているものを「ゾンビプロセス」と呼んだりします。これらはLinuxを安定して動かすための重要なキーワードです。
3. psコマンドで動いているプロセスを見てみよう
今、自分のLinuxでどんなプロセスが動いていて、どんなPIDが付いているのかを確認するには、psコマンドを使います。まずは一番シンプルな方法で実行してみましょう。
ps
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps
実行結果を見ると、PIDという列がありますね。これがプロセスIDです。CMDはそのプロセスを起動したコマンド名です。上の例では、操作画面である「bash」と、今実行した「ps」というコマンド自身の二つが動いていることがわかります。
全てのユーザーが動かしているプロセスを詳しく見たいときは、auxというオプションを付けて実行するのが一般的です。これにより、システム全体で何が起きているか丸見えになります。
4. 特定のプロセスのPIDを調べる方法
たくさんのプロセスの中から、特定のプログラムのPIDだけを知りたいときがあります。例えば「Webサーバーが動いているか確認したい」「調子の悪いアプリの番号を知りたい」といった場面です。そんな時は、pgrepコマンドが便利です。
例えば、システムにログインするためのプログラムである「sshd」のPIDを探してみましょう。
pgrep sshd
850
このように、数字だけが返ってきます。この「850」が、そのプログラムに割り当てられた固有の番号です。また、ps auxとgrepという検索コマンドを組み合わせて、より詳細な情報を取得することもよく行われます。
ps aux | grep sshd
root 850 0.0 0.1 15824 7104 ? Ss Jan08 0:00 /usr/sbin/sshd -D
user 9999 0.0 0.0 6432 2120 pts/0 S+ 10:00 0:00 grep --color=auto sshd
この長い結果の2列目にあるのがPIDです。これを使えば、特定のプログラムを狙い撃ちで操作できるようになります。
5. 止まらなくなったプロセスを終了させる(killコマンド)
PIDを知る最大のメリットの一つは、暴走して止まらなくなったプログラムを強制的に終了させることができる点です。これには「kill(キル)」という物騒な名前のコマンドを使います。
使い方は簡単で、kill [PID]と入力するだけです。これは「その番号のプロセスに対して、『終わってください』という合図(シグナル)を送る」という意味になります。
kill 5678
もし、通常のkillで終了してくれない頑固なプロセスの場合は、最終手段として-9というオプションを付けます。これは「強制終了」を意味し、プログラムに猶予を与えず即座に停止させます。
kill -9 5678
ただし、保存していないデータがある場合などは消えてしまう可能性があるので、強制終了は慎重に行いましょう。また、自分以外のユーザーのプロセスを終了させるには、管理者権限が必要になります。
6. リアルタイムでプロセスを監視する(topコマンド)
これまでは「その瞬間の状態」を見るコマンドでしたが、パソコンのタスクマネージャーのように、刻一刻と変わる動きを見たい場合はtopコマンドを使います。これがエンジニアが最もよく使う監視ツールの一つです。
top
top - 10:15:20 up 1 day, 2:30, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1984.4 total, 1250.2 free, 240.5 used, 493.7 buff/cache
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
850 root 20 0 15824 7104 6020 S 0.3 0.4 0:00.15 sshd
1 root 20 0 168432 11232 8240 S 0.0 0.6 0:01.42 systemd
この画面では、どのプロセスがCPU(コンピュータの頭脳)をたくさん使っているか、メモリをどれくらい消費しているかが一目でわかります。一番上の行にPID 1とありますが、これはLinuxが起動したときに最初に生まれる、すべてのプロセスの「ご先祖様」にあたります。
topコマンドを終了したいときは、キーボードの「q」を押せば元の画面に戻れます。初心者の方は、まずこの画面を眺めて「ああ、私のコンピュータの中では今こんなにたくさんの番号(PID)が動いているんだな」と感じることから始めてみてください。
7. 管理者権限が必要なプロセス管理
Linuxでは、セキュリティのために「自分に関係ないプロセス」を勝手にいじることができないようになっています。他のユーザーが動かしているプログラムや、システム全体に関わる重要なプロセスを操作するには、「root(ルート)」と呼ばれる最強の管理者権限が必要です。
例えば、システム全体に関わるPIDを操作する際は、コマンドの前にsudoを付けて実行します。
sudo kill 850
ルートユーザーでの操作は非常に強力で、間違ったPIDを指定して終了させてしまうと、Linux自体の動作が不安定になったり、突然再起動したりすることもあります。PIDを指定するときは、必ずpsコマンドなどで「その番号が本当に止めていいものか」を確認する癖をつけましょう。
8. ジョブとプロセスの違いについて
最後に、よく混同される「ジョブ」との違いを説明します。どちらもプログラムの実行を指しますが、見ている視点が違います。
プロセスは「OS(システム)」から見た管理単位です。PIDという番号で、システム全体の中で厳密に管理されます。それに対してジョブは「ユーザー(あなた)」から見た作業単位です。あなたがターミナルで入力した一つの命令が一つのジョブになります。
例えば、大きなファイルをダウンロードしながら別の作業をしたいとき、ジョブを「バックグラウンド(裏側)」に回すことができます。このとき、裏で動いているジョブにも必ずPIDが割り振られています。つまり、ジョブは私たちが操作する時の呼び名で、その実体はOSがPIDで管理するプロセスである、と考えると分かりやすいでしょう。