このページでは、Mac でファイルやポートを使用しているプロセスを特定する方法について解説します(プロセスとは、ざっくり言えば「実行中のプログラム」のことです)。
ページのタイトルにも書いている通り、lsof
コマンドにより特定のファイルやポートを使用しているプロセスを特定することが可能です。
lsof
コマンドはターミナルから実行しますので、事前にターミナルを開いておく必要があります。ターミナルの開き方やターミナルを扱う上で知っておいた方が良い知識、基本的なコマンドについては下記ページで解説していますので、この辺りを知りたいという方は下記ページも合わせて読んでみてください。
ちなみに、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.exe
は lsof
コマンドの動作確認用に私が作成したプログラムです)。
また、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
コマンドで表示することもできますので、興味があれば是非調べてみてください。