fuserを使った競合リソースの特定と解放
fuserコマンドの引数には、ファイルのパス、マウント中のファイルシステム名、名前空間/ポートのペア(Telnet/TCPなど)のいずれかを指定する。ここに指定したリソースが現在使用中であった場合、fuserからは、リソースの名前とそこにアクセスしているプロセスの全IDおよび、これら各プロセスのアクセスタイプを示すコードが一覧される。アクセスタイプの識別コードは次のように定義されている。
- c――指定ディレクトリを当該プロセスがカレントディレクトリにしている
- e――指定ファイルを当該プロセスが実行可能ファイルとしている
- f――指定ファイルを当該プロセスが読み込み用に開いている
- F――指定ファイルを当該プロセスが書き込み用に開いている
- r――指定ディレクトリを当該プロセスがルートにしている
- m――指定ファイルを当該プロセスがメモリマップしているか共有ライブラリとして読み込んでいる
冒頭で取り上げたUSBドライブがアンマウントできないといった場合は、fuser -v -m /media/usbdrive
と指定することでfuserからは次のような出力が返されるはずだ。
USER PID ACCESS COMMAND /media/usbdrive: duane 4533 ..c.. bash
ここのfuser実行時に指定した-m
は、調査対象がマウントポイント(または当該マウントポイントのファイル)であることの指定、同じく-v
は、列見出しおよびプロセス所有者を含めた詳細表示をさせるためのオプションである。そして実行結果の出力には、このUSBドライブに現在アクセス中のプロセスIDが4533であるという情報が示されている。このプロセスに関するより詳しい情報が必要であればps aux | grep 4533
といったコマンドを実行すればいい。そうではなく、ドライブのアンマウントを阻害しているプロセスをkillすることだけが目的であれば、コマンドラインでのfuser実行時に-k
オプションを付けておくことで、指定したマウントポイントにアクセスしている全プロセスが自動的にkillされる。自動でkillさせるプロセスは一度確認しておかないと不安だという場合は-k
に-i
オプションを併用しておくことで、ユーザによる確認を経てからkillされるようになる。
fuserを使うと、ネットワークポートにアクセス中のプロセスも確認できる。例えばFTPサーバを起動させた際に指定ポートが使用中であるというメッセージが表示された場合はfuser -v -n tcp 21
というコマンドの実行で次のような情報が出力される。
USER PID ACCESS COMMAND 21/tcp: root 4391 F.... vsftpd
この出力は、ポート21は既にvsftpd FTPサーバが使用しているという意味である。このケースにおいても-k
によるプロセスの自動killおよび-i
によるkill前のユーザ確認オプションが利用できる。また特定サービスが使用するポートに詳しくないというユーザもいるだろうが、fuserはサービスの名前による指定にも対応している(例えばfuser -n tcp ftp
など)。
USBドライブの正常なアンマウントやFTPサーバの確実な起動には特定リソースの解放が必要となるケースもあるが、そうした操作に必要な情報を取得する際に有用なのが、本稿で解説したコマンドライン形式で利用するfuserというツールである。またfuserをスクリプト中で使用すれば、削除対象のファイルが現在使用中でないか、特定アプリケーションに使用させたいポートが他のサービスで使われていないか、アンマウントしてチェックしたいファイルシステムが現在使用されていないか、といった確認処理が行えるようになる。fuserおよび関連オプションの詳細については、manページを参照して頂きたい。
Duane Odomは米国防総省のコンピュータプログラマ兼フリーランスライターであり、2001年以来のLinuxユーザでもある。