【Mac】lsof コマンドでファイルやポートを使用しているプロセスを特定する

lsofコマンドの紹介ページアイキャッチ

このページでは、Mac でファイルやポートを使用しているプロセスを特定する方法について解説します(プロセスとは、ざっくり言えば「実行中のプログラム」のことです)。

ページのタイトルにも書いている通り、lsof コマンドにより特定のファイルやポートを使用しているプロセスを特定することが可能です。

lsof コマンドはターミナルから実行しますので、事前にターミナルを開いておく必要があります。ターミナルの開き方やターミナルを扱う上で知っておいた方が良い知識、基本的なコマンドについては下記ページで解説していますので、この辺りを知りたいという方は下記ページも合わせて読んでみてください。

macのターミナルアプリの使い方の解説ページアイキャッチMacでのターミナルアプリの使い方

Macのターミナルで良く使うコマンド集紹介ページのアイキャッチMacのターミナルでよく使うコマンド集(初心者向け)

ちなみに、lsof コマンドの最初の文字は小文字の l(エル)であり、フォルダ内のファイル一覧を表示するコマンドである ls の後ろに  of を追加したものと考えると覚えやすいと思います。 

lsof コマンドでファイルを開いているプロセスを特定する

lsof コマンドの引数に ファイルパス を指定することで、そのファイルを開いているプロセスを特定することができます(% は入力不要です)。

ファイルパス 部分は フォルダパス でも良く、そのフォルダを開いているプロセスを特定するようなこともできます。

% lsof ファイルパス

例えば、/Users/daeu/Documents/text.txt を開いているプロセスを特定したい場合、下記のように lsof コマンドを実行します。

% lsof /Users/daeu/Documents/text.txt

上記では、絶対パスでファイルパスを指定していますが、相対パスで指定しても良いですし、調べたいファイルが存在するフォルダに移動してからファイル名だけ指定するのでも良いです(Mac では問題ないことを確認しています)。

実行すれば、そのファイルを開いているプロセスが存在する場合、そのプロセスの情報が表示されます。表示結果は下記のようになります(画面が狭いと改行されて読みにくくなるので注意してください)。

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF       NODE NAME
Preview  49657 daeu  txt    REG    1,4 13185129 4342123988 image.png
main.exe 49766 daeu    3r   REG    1,4 13185129 4342123988 image.png

COMMAND の列で大体どのプロセス(アプリ・プログラム)が lsof に指定したファイルを開いているかが分かると思いますし、USER の列でどのユーザーがそのファイルを開いているかも確認することができます。

特に lsof コマンドの表示結果の上側の行の場合、COMMAND の列に Preview と表示されているので、どのアプリ・プログラムから生成されたプロセスがファイルを開いているかはすぐに分かると思います(Mac ユーザーならお馴染みのプレビューアプリです)。

それに対して、下側の行の場合は COMMAND の列に main.exe と表示されており、ちょっと得体の知れない名前が表示されています。

このように、COMMAND の列を読んでも何のプロセスであるかがはっきりしない場合は、ps コマンドを使うと良いです。ps コマンドはプロセスの詳細情報を表示するコマンドです。

この ps コマンドの引数に、lsof コマンドの実行結果の PID の列に表示されている数字を指定すれば、ファイルを開いているプロセスの詳細情報を知ることができます。

例えば、下側の行の PID である 49766 を引数に指定して ps コマンドを実行すれば、下記のように表示されます。

% ps 49766
  PID   TT  STAT      TIME COMMAND
49766   ??  SX     0:00.00 /Users/daeu/Documents/programming/fgets/main.exe

これで、ファイルを開いているプロセスが、どのプログラムが実行されて(どのコマンドが実行されて)生成されたのかの詳細を確認することができます(上記の main.exelsof コマンドの動作確認用に私が作成したプログラムです)。

また、PID さえ分かれば、kill コマンドを実行してプロセスを強制終了させることも可能です。

なので、lsof コマンドでファイルを開いているプロセスの PID を確認し、そのプロセスを kill コマンドで強制終了させるようなこともできます(実行する場合は本当にそのプロセスを強制終了して良いかどうかしっかり確認してからにしてください)。

$ kill 49766

いろいろ lsof コマンドは試した感じだと、特にテキストファイルに関してはテキストエディットアプリや vi コマンドで開いても lsof の結果に表示されなくて正直謎な部分はあるのですが、ある程度は lsof コマンドで開いているプロセスを特定することは出来ると思います。

lsof コマンドでポートを使用しているプロセスを特定する

lsof コマンドではファイルを開いているプロセスだけでなく、特定のポートを使用しているプロセスも特定することができます。

PC でウェブ関連の開発を行なっていると結構出くわすのが「そのポートは既に使用中です」エラーです。lsof コマンドを利用することで、このエラーの原因、つまり、そのポートを何のプロセスが使用しているかを確認することができます。

特定のポートを使用しているプロセスの確認の仕方は lsofコマンドでファイルを開いているプロセスを特定する で紹介したコマンドと似ていますが、ポートに関して lsof コマンドを実行する際には -i オプションを指定する必要があります。

具体的には下記のコマンドで、ポート番号 に指定したポートを使用しているプロセスを表示することができます。

% lsof -i:ポート番号

例えば ポート番号8000 を指定すれば、ポート番号 8000 のポートを使用しているプロセスの一覧を表示することができます(画面が狭いと改行されて読みにくくなるので注意してください)。

% lsof -i:8000
COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
python3.9 50382 daeu    5u  IPv4 0x231f7f824e534a43      0t0  TCP localhost:irdmi (LISTEN)

結果の見方は lsofコマンドでファイルを開いているプロセスを特定する で紹介しましたので、ここでの説明は省略させていただきます。

スポンサーリンク

まとめ

このページでは、Mac でファイルを開いているプロセス、ポートを使用しているプロセスを特定する方法について解説しました!

ターミナルで lsof コマンドを実行することで、ファイルを開いているプロセスやポートを使用しているプロセスの情報を表示することができ、それによって原因となるプロセスを特定することができます。

今回はファイルとポートに対して lsof コマンドについて解説しましたが、lsof コマンドはオプション等を指定することでいろんな使い方ができるようです。

下記ページでも解説しているように、コマンドの詳細情報は man コマンドで表示することもできますので、興味があれば是非調べてみてください。

macのターミナルアプリの使い方の解説ページアイキャッチMacでのターミナルアプリの使い方

同じカテゴリのページ一覧を表示