Macユーザーのためのlsofコマンド徹底解説

lsofコマンドを使いこなして、Mac上でどのプロセスがファイルを開いているのかを突き止めましょう。開発者やパワーユーザー向けのガイドです。

(Updated )

外付けドライブが取り出せない。macOSは「1つ以上のプログラムがこのディスクを使用している可能性があります」という、いら立たしいほど曖昧なメッセージを表示するだけです。どのプログラムなのか?それは教えてくれません。そんなときに役立つのが lsof です。

この名前は「list open files(開いているファイルの一覧)」を意味し、まさにそのとおりの働きをします。macOSのようなUnixベースのシステムでは、ネットワーク接続、デバイス、ディスクボリュームを含め、ほとんどあらゆるものがファイルとして扱われます。ドライブを取り出せないとき、lsof を使えば、どのプロセスがそれを離さずに掴んでいるのかを正確に教えてくれます。

基本的な構文

取り出しの問題に対してlsofを使う最もシンプルな方法はこうです。

lsof /Volumes/YourDriveName

“YourDriveName” の部分を実際のドライブ名に置き換えてください。名前にスペースが含まれる場合は、パス全体を引用符で囲みます。

lsof "/Volumes/My Backup Drive"

これで、そのボリューム上でファイルハンドルを開いているすべてのプロセスの一覧が返されます。各行には、プロセス名、そのID(PID)、それを実行しているユーザー、そしてアクセスされている特定のファイルに関する情報が表示されます。

出力の読み方

典型的なlsofの出力はこのようになります。

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mds_store  1234   root   4r   REG   1,12   524288  ...  /Volumes/External/.Spotlight-V100/...
Finder     5678   you    3r   DIR   1,12     1024  ...  /Volumes/External

最も重要な列は、COMMAND(プロセス名)、PID(プロセスを終了させる際に使うプロセスID)、そしてNAME(実際にアクセスされているファイルパス)です。

FDはファイルを開いたモードを示します。rは読み取り、wは書き込み、uは両方です。現在の動作を示すものではなく、ボリュームに未完了の書き込みがない証拠にはなりません。

ドライブを塞いでいる原因を突き止める

取り出しの問題に限って言えば、たいていの場合はどのプロセス名が表示されているかさえ分かれば十分です。よくある原因としては、mds や mds_stores(Spotlightのインデックス作成)、Finder、QuickLookUIService(サムネイル生成)、そして fsevents(ファイルシステムの監視)などが挙げられます。

出力が多すぎて絞り込みたいときは、grepを使えます。

lsof /Volumes/YourDriveName | grep -v "^COMMAND"

これでヘッダー行が取り除かれ、実際のプロセスだけが表示されます。重複を除いたプロセス名だけが欲しい場合はこうします。

lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u

便利なフラグ

-c フラグはコマンド名でフィルタリングします。Spotlightが原因ではないかと疑っている場合はこうです。

lsof -a -c mds /Volumes/YourDriveName

これで、名前が「mds」で始まるプロセスだけが表示されます。

+D フラグは、ディレクトリ内で開かれているすべてのファイルを再帰的に一覧表示します。

lsof +D /Volumes/YourDriveName

これは基本的な構文よりも徹底的ですが、ファイル数の多い大容量ドライブでは遅くなることがあります。

特定のユーザーがドライブ上で開いているプロセスを確認するにはこうします。

lsof -a -u yourusername /Volumes/YourDriveName

sudoなしでlsofを使う

デフォルトでは、lsofは自分のユーザーアカウントが所有するプロセスしか表示しません。root権限で実行されるシステムプロセス(Spotlightのmdsなど)は、sudoを付けてlsofを実行しない限り表示されません。

sudo lsof /Volumes/YourDriveName

パスワードの入力が必要になります。取り出しの問題のトラブルシューティングでは、原因となっているのがシステムプロセスであることが多いため、sudoの使用はほぼ必須です。

ブロックしているプロセスを終了する

作業を保存し、コピーとバックアップを完了させ、アプリを通常の方法で終了してから取り出しを再試行してください。 Ejectaは書き込みの安全性を保証しません。

kill 1234

1234の部分を実際のPIDに置き換えてください。それでうまくいかない場合は、強制的に終了させることもできます。

kill -9 1234

Spotlightのプロセス名だけでは読み取り専用と判断できません。ドライブを解放するためにmdsやmds_storesを強制終了しないでください。待機し、アプリを閉じて通常の取り出しを試してください。Ejectaはこれらを識別できますが、システムプロセスには通常の終了操作を提供しません。解放されない場合はすべて保存し、Macを完全にシステム終了してからドライブを外してください。

自分が起動したアプリケーション(ドライブのディレクトリにいるシェルを開いたターミナルのウィンドウなど)については、取り出しを試みる前に、そのアプリケーションを通常どおり閉じるか、ドライブから別の場所へ移動しておくほうがすっきりします。

よくあるシナリオ

現在のディレクトリがドライブ上にあるターミナル: 外付けドライブ内のフォルダにcdで移動していると、そのシェルプロセスがドライブを掴み続けます。別の場所にcdで移動する(cd ~)か、そのターミナルのウィンドウを閉じてください。

Finderのウィンドウ: Finderがドライブを開いたウィンドウを表示している場合、あるいはサイドバーでドライブを選択しているだけでも、取り出しが妨げられることがあります。ドライブの内容を表示しているFinderのウィンドウはすべて閉じてください。

Spotlightのプロセス名だけでは読み取り専用と判断できません。ドライブを解放するためにmdsやmds_storesを強制終了しないでください。待機し、アプリを閉じて通常の取り出しを試してください。Ejectaはこれらを識別できますが、システムプロセスには通常の終了操作を提供しません。解放されない場合はすべて保存し、Macを完全にシステム終了してからドライブを外してください。

ファイルを開いたままのバックグラウンドアプリ: アプリケーションによっては、ドキュメントを閉じたあとも最近使ったファイルへの参照を保持し続けるものがあります。Photoshopやビデオエディタのようなクリエイティブなアプリケーションがよくある原因です。アプリを完全に終了すれば、たいていはファイルが解放されます。

コマンドラインの先へ

ターミナルが苦手な方や、ドライブを取り外すたびにlsofの出力を読み解くのは避けたいという方には、グラフィカルな選択肢があります。

アクティビティモニタは特定のプロセスについて開いているファイルを表示できますが、どのプロセスを調べればよいかをあらかじめ知っておく必要があります。「このドライブを使っているのは何か?」という問いには簡単には答えてくれません。

Ejecta: Ejectaのドライブ診断は無料で、試用期間の制限はありません。有料ライセンスで対応アプリの終了・取り出し、すべて取り出す操作、Time Machineの操作が使えます。システムプロセスでは待機、認証、システム終了が必要な場合があります。先に保存し、転送を完了してください。

コマンドラインは、それを好む人にとっては強力なツールです。しかし、ドライブを取り外すというごく単純なことのために、それが必須であってはならないはずです。

Ejectaのドライブ診断は無料で、試用期間の制限はありません。有料ライセンスで対応アプリの終了・取り出し、すべて取り出す操作、Time Machineの操作が使えます。システムプロセスでは待機、認証、システム終了が必要な場合があります。先に保存し、転送を完了してください。

今すぐ購入 - $29 $9.99