USB ドライブのアンマウントを試みた際に、「デバイスまたはリソースがビジーです (Device or Resource Busy)」というエラーに遭遇したことはありませんか?この一般的な問題は、プロセスがまだデバイス上のファイルやディレクトリを使用している場合に発生します。これを解決するには、どのプロセスがそのリソースを保持しているかを特定する必要があります。このタスクのための強力なユーティリティが lsof と fuser です。
lsof を使用して開いているファイルの一覧表示
Linux では、ディスク、パイプ、ネットワークソケット、デバイスなど、ほぼすべてのものがファイルとして扱われます。lsof コマンド("list open files" の略)は、開いているすべてのファイルとそのファイルを使用しているプロセスを詳細に一覧表示します。
現在のディレクトリ (.) をどのプロセスが使用しているかを確認するには、以下を実行します。
pete@icebox:~$ lsof .
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lxsession 1491 pete cwd DIR 8,6 4096 131 .
update-no 1796 pete cwd DIR 8,6 4096 131 .
nm-applet 1804 pete cwd DIR 8,6 4096 131 .
xterm 2205 pete cwd DIR 8,6 4096 131 .
bash 2207 pete cwd DIR 8,6 4096 131 .
lsof 5914 pete cwd DIR 8,6 4096 131 .
出力には、各オープンファイルに関連付けられたコマンド (COMMAND)、プロセス ID (PID)、ユーザー (USER) が表示されます。この情報があれば、デバイスのアンマウントを妨げているプロセスを特定できます。
fuser コマンド
もう一つの優れたツールが fuser コマンド("file user" の略)です。このユーティリティは、特定のファイル、ソケット、またはファイルシステムを使用しているプロセスを特定します。linux fuser コマンドは、特定の特定のリソースにアクセスしているプロセスの PID を素早く確認する方法です。
-v (verbose) オプションを使用すると、より詳細な出力が得られます。
pete@icebox:~$ fuser -v .
USER PID ACCESS COMMAND
/home/pete: pete 1491 ..c.. lxsession
pete 1796 ..c.. update-notifier
pete 1804 ..c.. nm-applet
pete 2205 ..c.. xterm
pete 2207 ..c.. bash
ここでは、どのプロセスが現在のディレクトリを使用しているかが明確にわかります。ACCESS 列は、ファイルがどのように使用されているか(例:カレントディレクトリの場合は c)を示します。
fuser でプロセスを終了させる
fuser コマンドの重要な機能は、リソースを使用しているプロセスを終了させる能力です。fuser -k オプションは、指定されたファイルまたはファイルシステムにアクセスしているすべてのプロセスに SIGKILL シグナルを送信します。これは、ビジーなデバイスをアンマウントする際に特に役立ちます。
例えば、マウントポイント /mnt/usb を使用しているすべてのプロセスを強制終了するには、以下を実行します。
sudo fuser -k /mnt/usb
Linux で fuser -k を使用することは、リソースを解放するための迅速かつ効果的な方法です。
fuser vs lsof
では、fuser と lsof のどちらを使うべきでしょうか?
lsofは詳細な調査に優れています。開いているすべてのファイルに関する広範な情報を提供するため、複雑なトラブルシューティングに最適です。fuserはより直接的です。特定のファイルやマウントポイント上のプロセスを素早く特定し、必要に応じて終了させるのに最適です。fuser commandは、「デバイスまたはリソースがビジーです」というエラーを解決するためのより速い選択肢となることがよくあります。
どちらのツールも、すべての Linux ユーザーにとって不可欠です。ファイルを効率的に管理し、プロセスを管理するために、これらに慣れておきましょう。