pidof または pgrep を使用して Linux プロセスの PID を見つける方法

Linux プロセスのプロセス ID を見つけるには、次のように pidof コマンドを使用します: 「pidof example_name」。PID 名の一部しかわからない場合は、代わりに「pgrep example_name_fragment」を使用できます。「example_name」と「example_name_fragment」を検索する用語に置き換えます。

Linux プロセスを操作するには、多くの場合そのプロセス ID (PID) を知る必要があります。これは、実行中のソフトウェアの各部分に与えられる一意の番号です。PID を見つける方法は 2 つあります。

Linux プロセス ID とは何ですか?

内部的に、Linux は一意の ID 番号 (プロセス ID または PID と呼ばれる) を割り当てることで実行中のプロセスを追跡します。実行中のすべてのアプリケーション、ユーティリティ、およびデーモンには PID があります。

PID は単純な整数値です。新しく開始されたプロセスは、最後に発行された PID よりも 1 つ大きい PID を受け取ります。したがって、PID が最も大きいプロセスは、最も新しく (つまり、最近) 起動されたプロセスです。これは、システムが PID の最大値に達するまで続きます。

PID の上限は 32768 です。この値に達すると、Linux は先頭に戻り、以前に所有していたプロセスが終了したために解放された PID を探します。

PID が 1 のプロセスは、ブートアッププロセスによって Linux が起動されたときに起動される最初のプロセスです。systemd ベースのシステムでは、systemdになります。他のシステムではinitになる可能性が高いですが、一部の Linux ディストリビューションでは OpenRc や s6 などの代替手段を使用しています。

通常、そのプロセスに対して何らかのアクションを実行したい場合に、プロセスの PID を見つけることが役立ちます。プロセスの名前がわかっている場合にそのプロセスの PID を見つける方法を 2 つ紹介します。

pidof コマンドを使用して Linux PID を取得する方法

pidofコマンドは、「PID」と「of」の組み合わせと考えることができます。これは、このプロセスの PID は何ですか? と尋ねているようなものです。パラメーターなしでコマンドを使用すると、何も実行されません。コマンドプロンプトに何も表示されずに返されます。プロセス名を指定する必要があります。

pidof bash

pidofは、Bash シェルの PID が 8304 であることを示しています。psコマンドで確認できます。psをパラメーターなしで呼び出すだけです。現在のセッションで実行されているプロセスが報告されます。

ps

psは、bashプロセスとpsプロセスが実行されていることを示して、見つけられるすべてのプロセス (自身を含む) について報告します。予想通り、bashプロセスにはpidofで報告されたのと同じ PID があります。

複数のターミナルウィンドウを開いている場合、pidofはそれらすべてを報告します。

pidof bash

PID は上から下、つまり最新の PID から古い PID の順にリストされていることに注意してください。

これでは、それらのプロセスすべてを所有しているわけではない可能性があることが示されていません。pidofは、誰が所有しているかに関係なく、一致する名前を持つすべてのプロセスを見つけることができます。出力をgrepにパイプして詳しく見てみましょう。ps-e (すべてのプロセスを選択) オプションと-f (完全リスト) オプションを使用しています。

ps -ef | grep bash

2 つの bash プロセスはユーザー dave に属し、3 つ目はユーザー mary に属します。

1 つのアプリケーションが多くのプロセスを生成することがあり、それぞれが独自の PID を受け取ります。これは、Google Chrome で得られるものです。

pidof chrome

デフォルトでは、pidofはすべてのプロセスについて報告します。必要に応じて、それらのプロセスの最新のものだけを要求できます。-s (シングルショット) オプションはそのように機能します。

pidof -s chrome

killコマンドを使用してすべてのchromeプロセスを手動で強制終了するのは面倒です。プロセスのリストを変数に取り込むと、その変数をkillコマンドに渡すことができます。killコマンドはコマンドに複数の PID を受け入れることができるため、入力を受け入れてすべてのプロセスを強制終了します。

pid=$(pidof chrome)

echo $pid

kill $pid

pidof chrome

最初のコマンドはpidofからの出力を収集し、pidという名前の変数に割り当てます。画面にechoする必要はありません。変数が保持している内容を示すためにそれを行っているだけです。

変数をkillコマンドに渡し、pidofをもう一度使用して、Chrome プロセスが残っているかどうかを確認します。すべてが強制終了されています。

pidofの 1 つの癖は、シェルスクリプトの PID を返さないことです。スクリプトを実行しているbashシェルの PID を返します。スクリプトを実行しているシェルを確認するには、-x (スクリプト) オプションを使用する必要があります。

pidof -x sleep-loop.sh

ps -e | grep bash

pidofは bash シェルの PID を返し、psは 2 つのシェルが実行されていることを示しています。1 つはpidofコマンドを実行しているシェルで、もう 1 つはスクリプトを実行しているシェルです。

Linux で pgrep コマンドを使用して PID を見つける方法

pgrepコマンドは、Linux でプロセス ID を取得する点でpidofと少し似ています。ただし、検索手がかりと完全に一致するプロセスを見つけるだけでなく、名前が検索テキストを含むプロセスの PID も返します。

Firefox が実行されているコンピューターの例を次に示します。

pgrep firefox

pgrep fire

pgrep fox

pgrep refo

これらのコマンドはすべて Firefox プロセスを見つけ、PID を返します。ただし、次のコマンドを入力した場合:

pgrep refo

それ自体では、pgrep が Firefox を見つけたのか、preformd というデーモンを見つけたのかをどうやって知るでしょうか?

-l (名前のリスト) オプションを追加すると、pgrep は PID の横にプロセス名もリストします。

pgrep refo -l

一致するプロセスのインスタンスが複数ある場合は、すべてがリストされます。

pgrep bash

pidofの出力とは逆の順序である昇順でリストされていることに注意してください。古いプロセスから新しいプロセスへとリストされています。pidofで見たように、リストされたプロセスはすべて必ずしもあなたのものではないことに注意してください。

-u (ユーザー ID) オプションを使用すると、検索テキストと一致し、指定されたユーザーが所有するプロセスを検索できます。

pgrep bash -u dave

今回は結果に 3 つの bash プロセスが表示されます。もう 1 つはmaryによって使用されています。

pgrep bash -u mary

ユーザー名をコンマ区切りのリストとして連結できます。

pgrep bash -u dave,mary -l

そして、特定のユーザーのすべてのプロセスを表示するように要求できます。

pgrep -u dave -l

完全なコマンドラインを確認するには、-a (完全リスト) オプションを使用します。

pgrep -u dave -a

PID の所有権について

すべてのシステムプロセスが root ユーザーによって所有されているわけではありません。もちろん、多くがそうであるものの、すべてがそうではありません。たとえば、このコマンドは機能します:

pgrep avahi-daemon

しかし、このコマンドは失敗します。

pgrep -u root avahi-daemon

rootがそのプロセスを所有していないため、失敗します。実際の所有者は「avahi」というシステムユーザーです。正しいユーザー名を使用すると、コマンドが機能します。

pgrep -u avahi avahi-daemon

注意すべき落とし穴です。