「1つ以上のプログラム」は何なのか#

Macで外部ストレージを使用した後、それを取り外そうとすると

ディスク “……” を取り出せませんでした。1つ以上のプログラムが使用している可能性があります。

というメッセージが表示され、取り外しができないことがある。

「強制的に取り出す」を選ぶことで取り外すことはできるだろうが、これはあくまで緊急用のものであろう。

原因となるプログラムがわかっていればそれを終了させれば良いが、常駐プログラムが要因の場合などはGUIでは確認できない。結果として、強制取り出しや再起動を選んでしまいがちである。

だが、「1つ以上のプログラム」の正体がわかれば、それを安全に終了させることで再起動を行わずとも対応できるのではないだろうか。

どのプロセスがストレージを使用しているのか#

macOSでは lsof コマンドを使うことで、どのプロセスがファイルやディスクを使用しているのかを確認できる。

$ lsof /Volumes/MySSD
COMMAND    PID   USER   FD   TYPE DEVICE   SIZE/OFF   NODE NAME
Spotlight 759 KACKUN  txt    REG   1,22     163840 204271 /Volumes/MySSD/写真 Library.photoslibrary/database/Photos.sqlite-shm
Spotlight 759 KACKUN   26u   REG   1,22 1175343104 204270 /Volumes/MySSD/写真 Library.photoslibrary/database/Photos.sqlite
...
mediaanal 771 KACKUN   11r   REG   1,22     881712 204272 /Volumes/MySSD/写真 Library.photoslibrary/database/Photos.sqlite-wal
...
photolibr 778 KACKUN   21u   REG   1,22 1175343104 204270 /Volumes/MySSD/写真 Library.photoslibrary/database/Photos.sqlite

このように複数のPIDが使用していることが分かる。

ここで現れたPIDに対し kill を用いてSIGTERMを送り、プロセスに正常終了を要求する。

$ kill 759
$ kill 771
$ kill 778

全てのプロセスが無事に終了すれば、ストレージが取り外せるようになるはずだ。

ただし、 mediaanalysisdphotolibraryd などのシステムデーモンは launchd によって管理されており、設定によっては終了後すぐに再起動されることがある。 その場合は再度 lsof で確認し、同様の手順を繰り返す必要があるかもしれない。

なぜ、そうなっているのか#

私の場合、SSDに写真ライブラリを置いている。 写真アプリを終了した後も、macOSはバックグラウンド処理で Spotlightmediaanalmediaanalysisd )、 photolibrphotolibraryd )による処理を行っている。 つまり、macOS自身が写真ライブラリを解析し、検索インデックスやメディア解析を行っていたのである。 GUI上では「1つ以上のプログラム」としか表示されないが、その正体はしばしばOS自身なのかもしれない。