いつか役立つfuserコマンド

4月 19, 2010

個人的に普段あまり利用することがないのだが、覚えておきたいfuserコマンドの使い方。
様々な場面で利用する物だと思うが、特にumountでアンマウントできない、
ファイルやディレクトリを削除できない、などという時には、特に。
例えば以下のような状況でイラッとくることがあるので、対処法を書いておこう。

# umount /mnt
umount: /mnt: device is busy


上記のように”device is busy”(デバイスは使用中です)メッセージが出てしまった時に
umount -lで強制的にアンマウントしてしまったことがあるが、本来であれば対象の
ファイルシステムを掴んでいるプロセスを割り出してkillするのが正しい手順なのだろう。
(ちなみに-l は”lazy”のことで、「強制的に」とは少し意味合いが違う。ひと言でいうと
ファイルシステムから切り離してからアンマウントするオプション、となるそうだ)

掴んでいるプロセスを確認するには以下のようにfuserコマンドを実行してみると、
対象FSにアクセスしているユーザやプロセスのPID、コマンドが表示される。

# fuser -va /mnt


-uオプションをつけると更に、プロセスの所有者名を表示する。
なお、以下のようにlsofコマンドを利用してもよい。

# lsof | grep ‘/mnt’


プロセスを特定して普通に”# kill PID”で消去してもよいが、以下のようにすれば
/mntにアクセスしているプロセスをすべてkillできる。

# fuser -km /mnt


-iオプションをつければ、プロセスを kill する前にユーザーに確認する。

manからの抜粋であるが、fuserの名オプションの説明もメモしておく。

-a コマンドラインで渡されたすべてのファイルを表示する。
-k 指定したファイルにアクセスしているプロセスを kill する。
-i プロセスを kill する前にユーザーに確認する。
-l 使用できる signal すべてをリストアップする。
-m  filename には、マウントされたファイルシステム上のファイルか、
マウントされたブロックデバイスを指定する。そのファイルシステム上の
ファイルにアクセスしているすべてのプロセスが表示される。
-n space 別の名前空間を選択する。
-s 表示を抑制する。 -u, -v はこのモードでは無視される。
-signal プロセスを kill する時に、 SIGKILL 以外のシグナルを指定する。
-u それぞれの PID にプロセスの所有者名を追加する。
-v 饒舌 (verbose) モード。
※ACCESS 列において、アクセスがカーネルによって行われている場合
(たとえばマウントポイントやスワップファイルなど) には、 PID の代わりに
kernel と表示される。

-nオプションの説明は分かりづらいが、以下コマンドでポート443を使用している
プロセスIDをチェックしたりする。

# fuser -n tcp 443


同じ目的なら以下でもいいとは思うが。

# netstat -altp | grep 443


ところで冒頭の”device is busy”メッセージが出た時には、まずpwdして自分が/mntに
いないことを確認。pwdしても/mntじゃない。何故だ、という時は、自分自身が別の
ターミナルを開いていてそこで使用していた、という可能性もあるかと・・・
(これは自分の例、、、)この辺は最初に書いておくべきだった。
まぁよしとして、また長くなりそうなので、このへんで切り上げます。

参考URL
Manpage of FUSER
fuserを使った競合リソースの特定と解放


Categories: Linuxコマンド