fuser 入門 - ファイル・ディレクトリを使用中のプロセスを特定する

fuser 入門 - ファイル・ディレクトリを使用中のプロセスを特定する

この記事で解決できること

  • fuserファイル・ディレクトリを使用中のプロセス を特定できる
  • umount で出る 「target is busy」「device is busy」の犯人 を即座に突き止められる
  • 使用中プロセスを 安全に kill する型-k / -i / シグナル指定)が身につく

結論(実務の型)

  • 「誰が掴んでいるか」を知りたい → fuser -v <対象>
  • マウントを外せない → fuser -m <マウントポイント> で犯人特定
  • 止めても安全と確認できたら → fuser -ki <対象>(対話確認つき kill)

前提(対象環境)

  • ディストリ問わず(fuserpsmisc パッケージ提供)
  • 例は Ubuntu / systemd 環境を想定
  • マウント操作・kill には対象によって root 権限が必要

fuser とは何か?

結論: fuser は指定したファイル・ディレクトリ・マウントポイント・ソケットを「現在使用中のプロセス」を逆引きするコマンド。PID とアクセス種別を返す。

pstop は「プロセス → そのプロセスが何をしているか」を見る。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(ファイルを編集中)が掴んでいる。まずは正攻法で対処する。

  1. bash → そのシェルで cd して /mnt/data から出る
  2. 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)

シグナルは -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

次に読む