fuser 入門 - ファイル・ディレクトリを使用中のプロセスを特定する
この記事で解決できること
fuserで ファイル・ディレクトリを使用中のプロセス を特定できるumountで出る 「target is busy」「device is busy」の犯人 を即座に突き止められる- 使用中プロセスを 安全に kill する型(
-k/-i/ シグナル指定)が身につく
結論(実務の型)
- 「誰が掴んでいるか」を知りたい →
fuser -v <対象> - マウントを外せない →
fuser -m <マウントポイント>で犯人特定 - 止めても安全と確認できたら →
fuser -ki <対象>(対話確認つき kill)
前提(対象環境)
- ディストリ問わず(
fuserはpsmiscパッケージ提供) - 例は Ubuntu / systemd 環境を想定
- マウント操作・kill には対象によって root 権限が必要
fuser とは何か?
結論:
fuserは指定したファイル・ディレクトリ・マウントポイント・ソケットを「現在使用中のプロセス」を逆引きするコマンド。PID とアクセス種別を返す。
ps や top は「プロセス → そのプロセスが何をしているか」を見る。fuser はその逆で、「このファイルを今どのプロセスが掴んでいるか」 を調べる。
最小の使い方は、対象を引数に渡すだけ。
$ fuser /var/log/syslog
/var/log/syslog: 742
742 が /var/log/syslog を使用中のプロセス ID。コロンの右に PID が並ぶ。何も掴んでいなければ PID は表示されず、終了コードが非ゼロになる。
fuser が見つからない場合は psmisc を導入する(sudo apt install psmisc / sudo dnf install psmisc)。pstree killall も同パッケージ。
誰が使っているか詳しく見るには?(-v)
結論:
-v(verbose)を付けると、USER・PID・ACCESS(アクセス種別)・COMMAND が表形式で並び、「誰が何の用途で掴んでいるか」が一目で分かる。
PID だけでは正体が分からない。-v で文脈をそろえる。
$ fuser -v /var/log/syslog
USER PID ACCESS COMMAND /var/log/syslog: syslog 742 F.... rsyslogd
ACCESS 列の各文字が「どう掴んでいるか」を示す。
| 記号 | 意味 |
|---|---|
c |
カレントディレクトリとして使用 |
e |
実行中の実行ファイル |
f |
オープン中のファイル(デフォルト表示で省略) |
F |
書き込み用にオープン中(同上) |
r |
ルートディレクトリ |
m |
mmap されたファイル・共有ライブラリ |
上の例の F.... は「rsyslogd が書き込み用に開いている」状態。-v 無しの通常表示では f / F は省略され、PID と末尾記号(c e r m)だけが出る点に注意する。
umount できない「target is busy」を解決するには?
結論: アンマウント失敗の原因は「そのファイルシステム上を使用中のプロセス」。
fuser -m <マウントポイント>で全プロセスを洗い出せる。
最頻出のシナリオがこれ。
$ sudo umount /mnt/data
umount: /mnt/data: target is busy.
-m を付けると、指定したマウントポイント上のファイルを使っている全プロセス を列挙する(引数はマウントポイントでもブロックデバイスでもよい)。
$ fuser -vm /mnt/data
USER PID ACCESS COMMAND
/mnt/data: alice 3210 ..c.. bash
alice 3398 F.... vim
この例では bash(カレントディレクトリが /mnt/data 配下)と vim(ファイルを編集中)が掴んでいる。まずは正攻法で対処する。
bash→ そのシェルでcdして/mnt/dataから出るvim→ 保存して閉じる
それでも残る常駐プロセスがあり、止めて安全と確認できた場合のみ、次の kill に進む。
-m の引数を マウントポイントではなく単なるディレクトリ に渡すと、そのファイルシステム全体のプロセスが対象になる。-M(--ismountpoint)を併用すると、引数が実際のマウントポイントのときだけ動作し、誤爆を防げる。
使用中のプロセスを安全に止めるには?(-k / -i)
結論:
-kで使用中プロセスを kill できるが、デフォルトは SIGKILL で即死。実務では-i(対話確認)と明示シグナル指定を併用するのが安全。
-k は列挙したプロセスにシグナルを送る。何も付けないとデフォルトは SIGKILL(-9) で、プロセスは後始末なしに強制終了する。
# 危険: 確認なしで /mnt/data 上の全プロセスを SIGKILL $ fuser -km /mnt/data
事故を避けるため、次の 2 つを足す。
# -i: 1 プロセスごとに kill するか対話確認 # -TERM: SIGKILL ではなく SIGTERM(正常終了を促す)を送る $ fuser -kim -TERM /mnt/data
USER PID ACCESS COMMAND /mnt/data: alice 3398 F.... vim Kill process 3398 ? (y/N)
fuser -k は 掴んでいるプロセスを無差別に止める。/(ルート)や /usr のようなシステム領域に対して実行すると、システムを巻き込んで停止させる危険がある。kill 前に必ず -v で対象を確認すること。
シグナルは -HUP -TERM -KILL のように名前で、または番号で指定できる。利用可能なシグナル一覧は fuser -l で確認する。
ポートを使用中のプロセスを調べるには?(-n)
結論:
fuser -n tcp <ポート>で、特定の TCP/UDP ポートを LISTEN・使用中のプロセスを特定できる。「アドレスは既に使用中」エラーの調査に有効。
-n <space> で名前空間を切り替える。tcp / udp を指定するとポート番号で検索できる。
# TCP 80 番を使用中のプロセス $ sudo fuser -v -n tcp 80
USER PID ACCESS COMMAND 80/tcp: root 1180 F.... nginx
fuser 80/tcp のように ポート/プロトコル 形式でも同じ結果になる。Address already in use でサーバが起動しないとき、犯人の特定に使える。
ポート・ソケットの調査は ss / lsof の方が情報量は多い。fuser は「掴んでいる PID をすぐ止めたい」場面(-k 連携)で軽快。用途で使い分ける。
fuser と lsof はどう使い分けるか?
結論: 「使用中の PID を特定して即 kill」までやるなら
fuser、開いているファイルやポートを詳細に一覧・調査するならlsof。役割が重なるが目的が違う。
| 観点 | fuser | lsof |
|---|---|---|
| 主目的 | 対象を使う PID の特定 + kill | 開いているファイル/ソケットの一覧調査 |
| 出力 | PID とアクセス種別(簡潔) | プロセス・FD・種別・サイズ等(詳細) |
| kill 機能 | あり(-k) |
なし(PID を別途 kill) |
| マウント点まるごと | -m が得意 |
+D / +f で代替 |
| 提供パッケージ | psmisc |
lsof |
「アンマウントできない犯人を特定してその場で止める」なら fuser -m が最短。「何が起きているか腰を据えて調べる」なら lsof。
コピペ用:busy 解決テンプレ
# 1) 犯人を確認(kill しない) fuser -vm /mnt/data # 2) 安全と確認できたら対話 + SIGTERM で停止 fuser -kim -TERM /mnt/data # 3) 改めてアンマウント sudo umount /mnt/data