Macユーザーのためのlsofコマンド徹底解説
lsofコマンドを使いこなして、Mac上でどのプロセスがファイルを開いているのかを突き止めましょう。開発者やパワーユーザー向けのガイドです。
外付けドライブが取り出せない。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」は読み書き両方を意味します。「cwd」と表示されていれば、そのプロセスがその場所を現在の作業ディレクトリにしているということです。これは、ドライブ上のフォルダを開いたままターミナルのウィンドウを起動しているときに起こります。
ドライブを塞いでいる原因を突き止める
取り出しの問題に限って言えば、たいていの場合はどのプロセス名が表示されているかさえ分かれば十分です。よくある原因としては、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 -c mds /Volumes/YourDriveName
これで、名前が「mds」で始まるプロセスだけが表示されます。
+D フラグは、ディレクトリ内で開かれているすべてのファイルを再帰的に一覧表示します。
lsof +D /Volumes/YourDriveName
これは基本的な構文よりも徹底的ですが、ファイル数の多い大容量ドライブでは遅くなることがあります。
特定のユーザーがドライブ上で開いているプロセスを確認するにはこうします。
lsof -u yourusername /Volumes/YourDriveName
sudoなしでlsofを使う
デフォルトでは、lsofは自分のユーザーアカウントが所有するプロセスしか表示しません。root権限で実行されるシステムプロセス(Spotlightのmdsなど)は、sudoを付けてlsofを実行しない限り表示されません。
sudo lsof /Volumes/YourDriveName
パスワードの入力が必要になります。取り出しの問題のトラブルシューティングでは、原因となっているのがシステムプロセスであることが多いため、sudoの使用はほぼ必須です。
ブロックしているプロセスを終了する
lsofの出力からプロセスID(PID)が分かったら、それを終了させることができます。
kill 1234
1234の部分を実際のPIDに置き換えてください。それでうまくいかない場合は、強制的に終了させることもできます。
kill -9 1234
ただし注意が必要です。mdsのようなシステムプロセスを終了させると、一時的に不具合が起こることがあります。プロセスは通常自動的に再起動しますが、しばらくの間Spotlightの挙動がおかしくなるかもしれません。Finderのようなアプリケーションを終了させるのは概して安全で、macOSが自動的にFinderを再起動します。
自分が起動したアプリケーション(ドライブのディレクトリにいるシェルを開いたターミナルのウィンドウなど)については、取り出しを試みる前に、そのアプリケーションを通常どおり閉じるか、ドライブから別の場所へ移動しておくほうがすっきりします。
よくあるシナリオ
現在のディレクトリがドライブ上にあるターミナル: 外付けドライブ内のフォルダにcdで移動していると、そのシェルプロセスがドライブを掴み続けます。別の場所にcdで移動する(cd ~)か、そのターミナルのウィンドウを閉じてください。
Finderのウィンドウ: Finderがドライブを開いたウィンドウを表示している場合、あるいはサイドバーでドライブを選択しているだけでも、取り出しが妨げられることがあります。ドライブの内容を表示しているFinderのウィンドウはすべて閉じてください。
Spotlightのインデックス作成: mds、mds_stores、mdworker といったプロセスは、新しいドライブを自動的にインデックス化します。完了を待つか、sudo mdutil -i off /Volumes/YourDriveName でインデックス作成を無効にするか、直接終了させることができます。
ファイルを開いたままのバックグラウンドアプリ: アプリケーションによっては、ドキュメントを閉じたあとも最近使ったファイルへの参照を保持し続けるものがあります。Photoshopやビデオエディタのようなクリエイティブなアプリケーションがよくある原因です。アプリを完全に終了すれば、たいていはファイルが解放されます。
コマンドラインの先へ
ターミナルが苦手な方や、ドライブを取り外すたびにlsofの出力を読み解くのは避けたいという方には、グラフィカルな選択肢があります。
アクティビティモニタは特定のプロセスについて開いているファイルを表示できますが、どのプロセスを調べればよいかをあらかじめ知っておく必要があります。「このドライブを使っているのは何か?」という問いには簡単には答えてくれません。
Ejecta は、まさにこの問題のために作られました。接続中のドライブを表示し、それぞれをブロックしているプロセスを特定し、ワンクリックでそれらのプロセスを終了できます。これは本質的に、lsofで必要となる調査作業をGUIで包んだものに、システムプロセスを安全に扱う知恵を加えたものです。
コマンドラインは、それを好む人にとっては強力なツールです。しかし、ドライブを取り外すというごく単純なことのために、それが必須であってはならないはずです。
毎回ターミナルを使いたくないなら、Ejectaがどのプロセスがドライブをブロックしているかを正確に表示します。しかもメニューバーから、ワンクリックでそのプロセスを終了できます。
今すぐ購入 — $9.99