用語集/問題が起きたとき

PID

別名: プロセスID

結論

PID(プロセスID)は、実行中の各プロセスを識別するためにmacOSが割り当てる番号です。実行中のプロセス同士でPIDが重なることはありませんが、プロセスが終了した後、その番号が再利用されることはあります。

アクティビティモニタでは、PIDが専用の列に表示されます。同じ名前のプロセスが複数あることもあるので、kill、sample、lsofなどのターミナルのコマンドは、PIDを使ってどのプロセスを指しているかを判断します。

macOSでは、PID 0がkernel_task、PID 1がlaunchdです。launchdは最初のプロセスで、システムのほかの部分を起動します。開いたアプリにはもっと大きな番号が付き、起動するたびに新しいPIDになります。

アプリのPIDを調べる方法

アクティビティモニタの一覧でアプリを探し、“PID”の列を読みます。列が隠れている場合は、“表示 > 表示項目 > PID”を選びます。

ターミナルでは、pgrep -l Safariで一致するプロセスがPID付きで一覧表示されます。ps -p <PID> -o pid,ppid,commでは、プロセスの名前と親プロセスのPIDが表示されます。

親PIDからわかること

最初のプロセスを除き、どのプロセスにも親、つまりそれを起動したプロセスがあります。アクティビティモニタで“表示 > すべてのプロセス(階層表示)”を選ぶと、こうした親子関係がツリーで表示されます。

ターミナルでPIDを調べる方法

ターミナルでのプロセス名は、アプリ名と異なることがあります。多くのアプリは“App Helper (Renderer)”のような名前のヘルパープロセスを動かしていて、それぞれに別のPIDがあります。

  1. “アプリケーション > ユーティリティ”からターミナルを開きます。
  2. pgrep -lx Finderを実行すると、名前が“Finder”と完全に一致するプロセスのPIDがわかります。xを省くと、名前の一部で一致させられます。
  3. アプリに複数のプロセスがある場合は、pgrep -lf "Google Chrome"を実行すると、コマンドライン全体で照合できます。
  4. 自分のシェルのPIDを知るには、echo $$を実行します。

PIDがどのアプリのものかを調べる方法

エラーメッセージやログファイルには、名前なしでPIDだけが書かれていることがよくあります。調べるにはps -p <PID> -o pid,ppid,user,commandを実行します。プログラムのフルパス、実行しているユーザ、親のPIDが表示されます。

アクティビティモニタでは、“PID”の列見出しをクリックして並べ替え、その番号までスクロールします。プロセスをダブルクリックすると情報ウインドウが開き、親プロセスも確認できます。

psで何も表示されなければ、そのプロセスはすでに終了しています。

PIDでできること

まずps -p <PID>で名前を確認しましょう。PIDは再利用されるので、以前にコピーした番号が、いまは別のプロセスのものになっていることがあります。

  • kill <PID>はプロセスに終了を求めます。kill -9 <PID>はただちに終わらせます。
  • sample <PID> 5は、プロセスが何をしているかを5秒間記録します。
  • lsof -p <PID>は、プロセスが開いているファイルとネットワーク接続を一覧表示します。
  • lsof -a -p <PID> -d cwdは、プロセスが実行されているフォルダを表示します。
  • top -pid <PID>は、CPUとメモリの使用状況をリアルタイムで表示します。終了するにはqを押します。

名前ではなくPIDを使うべきとき

killall Safariやpkill Safariのように名前で動作するコマンドは、一致するすべてのプロセスに作用します。デフォルトでは、killallは自分が所有する一致したすべてのプロセスに終了シグナルを送り、pkillは入力した文字列を名前に含むあらゆるプロセスに一致します。

アプリが1つだけなら問題ありませんが、多くのプロセスが同じ名前を持っている場合は危険です。ブラウザは数十のヘルパープロセスを動かすことがあり、nodeやpythonの複数のコピーが別々のプロジェクトのものかもしれません。PIDなら正確に1つのプロセスを対象にできるので、1つだけ止めて残りは動かしておきたいときはPIDを使いましょう。

名前を使う場合は、まず一致するものを確認しましょう。pgrep -l <name>でpkillが対象にするものが一覧表示され、killall -d <name>なら何も送らずにkillallが何をするかを表示します。

よくある質問

アクティビティモニタの“PID”とは?

PIDはプロセスIDの略です。実行中のプロセスごとに固有の番号で、プロセスを区別したり、ターミナルのコマンドで対象を指定したりするのに使います。

アプリのPIDは変わらない?

実行している間だけです。アプリを終了して開き直すと、新しいPIDになります。

MacのPID 1とは?

PID 1はlaunchdで、macOSでほかのプロセスを起動して管理するプロセスです。決して終了してはいけません。

MacでPIDを指定してプロセスをkillするには?

ターミナルでkill <PID>を実行します。終了しなければ、kill -9 <PID>でただちに終わらせます。この場合、保存していないデータが失われることがあります。

2つのプロセスが同じPIDを持つことはある?

同時にはありません。古いプロセスが終了した後、そのPIDが新しいプロセスに割り当てられることはあります。

アクティビティモニタのPID 0とは?

PID 0はkernel_taskで、macOSのカーネルを表します。終了することはできません。

関連項目

Windowsから乗り換えましたか? Mac用のタスク マネージャーやアクティビティモニタの代替アプリのおすすめもご覧ください。用語集のすべての用語も見られます。