そんな場面で、いきなりサーバーを再起動していませんか?
fuserコマンドを使えば、ファイルやディレクトリ、さらにはTCP/UDPポートを占有しているプロセスを一発で特定できます。
必要ならそのプロセスにシグナルを送って終了させることも可能です。
この記事では、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した上で、fuserコマンドの実践的な使い方を解説します。
umount時のbusyエラー解消、ポート占有プロセスの特定、安全なプロセス終了まで、現場で使う場面を一通りカバーします。
この記事のポイント
・fuser /mnt でマウントポイントを掴むプロセスを特定できる
・fuser -v でユーザー・コマンド名付きの詳細表示になる
・fuser -k -TERM /mnt でプロセスにSIGTERMを送って終了できる
・fuser 80/tcp でポート占有プロセスを特定できる(要root)
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜfuserコマンドが必要なのか?
umountしようとして「target is busy」、httpdを起動しようとして「Address already in use」——これらはいずれも、あるリソース(ファイル・ディレクトリ・ポート)を別のプロセスが占有していることが原因です。
psやtopではプロセス一覧は見られますが、「どのプロセスが/var/logを掴んでいるのか」までは分かりません。
そこで登場するのがfuserコマンドです。
fuserはpsutilsパッケージ(Ubuntu)またはpsmiscパッケージ(RHEL系)に含まれており、
ほぼ全てのLinuxディストリビューションに標準で入っています。
・ファイル/ディレクトリの占有確認:umount時やディスクメンテナンス時に必須
・ポート占有確認:サービス起動前に競合プロセスを特定
・プロセス強制終了:-kオプションで一括kill可能
似たコマンドとしてlsofがありますが、fuserは「このリソースを誰が使っているか」に特化しており、出力がシンプルで素早い判断に向いています。
より詳細な情報が必要な場合はLinux ポート確認の全コマンドも併せて参照してください。
基本的な使い方
1. ファイル・ディレクトリを使用中のプロセスを確認する
最もよく使うのが、あるディレクトリを掴んでいるプロセスの確認です。# /mnt を使用中のプロセスを表示 fuser /mnt # 実行結果の例 /mnt: 2841c 2841e 3127c
・c:カレントディレクトリ(cd /mnt している)
・e:実行中の実行ファイルがそこにある
・f:ファイルをopen中(通常表示されない)
・r:ルートディレクトリ(chroot)
・m:mmapまたは共有ライブラリ
プロセスIDだけ見てもコマンド名が分からないので、次の
-vオプションを併用するのが実務的です。2. -v オプションで詳細表示する
# 詳細表示(USER・PID・ACCESS・COMMAND) fuser -v /mnt # 実行結果の例 USER PID ACCESS COMMAND /mnt: root 2841 ..c.. bash apache 3127 ..c.. httpd
-vで済みます。3. ディレクトリ配下を再帰的にチェックする
ディレクトリそのものだけでなく、配下のファイル全てをまとめて確認したい場合は-mオプションを使います。# /mnt 配下のマウント全体を使用しているプロセスを表示 fuser -vm /mnt # 実行結果の例(/mntにマウントされたFS全体を掴む全プロセス) USER PID ACCESS COMMAND /mnt: root kernel mount /mnt root 2841 ..c.. bash apache 3127 ..c.. httpd root 4521 F.... tail
-mはumount前の調査に最も役立つオプションです。対象ファイルシステム全体を掴むプロセスを漏れなく拾えます。なおマウント関連の基本操作はmount コマンドの使い方を参照してください。
umount時の「target is busy」を解消する実践手順
現場で最も頻出するのがこのケースです。NFSやUSB、ループバックデバイスをumountしようとして失敗する時の対処を順に見ていきます。1. まずは誰が掴んでいるかを特定する
# umountが失敗する umount /mnt/nfs # umount: /mnt/nfs: target is busy. # fuserで原因プロセスを特定 fuser -vm /mnt/nfs
2. プロセスを安全に終了させる
業務プロセスでない(バッチ残骸・ゾンビ・デバッグ残り)と確認できたら、SIGTERMで終了させます。# SIGTERM(デフォルト)で穏やかに終了させる fuser -k -TERM -m /mnt/nfs # SIGTERMで止まらない場合のみ、SIGKILLを使う fuser -k -KILL -m /mnt/nfs
-kオプションは指定リソースを掴む全プロセスに一括でシグナルを送ります。重要プロセスまで巻き込む可能性があるため、必ず先に-vで確認してから実行してください。3. 対話モードで確認しながらkillする
本番サーバーでは、1プロセスずつ確認しながら終了させる-i(interactive)オプションが安全です。# 対話的に「このプロセスをkillしますか?」と確認してくれる fuser -k -i -TERM -m /mnt/nfs # 実行結果の例 USER PID ACCESS COMMAND /mnt/nfs: root 4521 F.... tail Kill process 4521 ? (y/N) y
-iは業務中のサーバーでfuser -kを使う時の事実上の必須オプションです。4. それでもumountできない場合はlazy unmount
プロセスをkillしても解消しないケース(NFSサーバー側が落ちている等)では、umount -l(lazy unmount)でマウントを切り離せます。# 参照している全プロセスがファイルを閉じた時点でumountされる umount -l /mnt/nfs
-lは「見えなくするだけ」で、内部ではまだマウントが継続しています。可能な限りfuser -kで根本解決してから通常umountを試みてください。ポート占有プロセスを特定する(fuser n/tcp)
fuserはTCP/UDPポートを掴むプロセスも調査できます。httpdやnginxを起動しようとして「Address already in use」が出た時の定番の使い方です。# 80/tcp を使っているプロセスを特定(root権限が必要) sudo fuser -v 80/tcp # 実行結果の例 USER PID ACCESS COMMAND 80/tcp: root 1823 F.... nginx nginx 1824 F.... nginx nginx 1825 F.... nginx
・ポート指定には必ずroot権限(sudo)が必要です
・80/tcp のように「ポート番号/プロトコル」で指定します
・UDPなら 53/udp、IPv6は特に指定不要(自動的に含まれる)
ポート番号での調査はssやlsofでも可能ですが、fuserは「そのポートを掴むプロセス」を最短で特定できます。
応用・実務Tips
デバイスファイル指定でブロックデバイスを調査
/dev/sdb1 などのブロックデバイスを直接指定すると、そのデバイスを使っているプロセスが分かります。# /dev/sdb1 を使用中のプロセスを確認 sudo fuser -v /dev/sdb1
SIGHUPでサービスを再起動させる
killの代わりにSIGHUPを送ることで、多くのデーモンを設定再読込させられます。# /etc/nginx/nginx.conf を開いているnginxにSIGHUPを送る sudo fuser -k -HUP /etc/nginx/nginx.conf
lsofとの使い分け
| やりたいこと | コマンド |
|---|---|
| 指定リソースを掴むプロセスを素早く特定 | fuser -v /mnt |
| プロセスに直接killシグナルを送る | fuser -k -TERM -m /mnt |
| あるプロセスが開いている全ファイルを一覧 | lsof -p PID |
| 削除済みだが開かれたままのファイルを探す | lsof +L1 |
「fuser: command not found」が出た時の対処法
最近のミニマルなコンテナイメージやクラウドVMでは、fuserがデフォルトで入っていない場合があります。# RHEL / Rocky Linux / AlmaLinux / CentOS系 sudo dnf install psmisc # Ubuntu / Debian系 sudo apt install psmisc
「Specified filename /xxx does not exist」
fuserに存在しないファイルパスを指定するとこのエラーになります。typoの可能性が高いですが、シンボリックリンクの先が消えているケースもあります。
ls -lで実体を確認してください。root以外でポート指定した時の「Cannot stat」
ポート番号指定での調査にはroot権限が必須です。一般ユーザーで実行すると、他ユーザーのプロセス情報が見えずに不完全な結果になります。必ずsudoを付けてください。本記事のまとめ
fuserコマンドは「誰がこれを掴んでいるのか?」を一発で答えてくれる、トラブル対応の必須ツールです。20年以上サーバー運用を続けてきた経験から言うと、umount失敗やポート競合の9割はfuser -vで原因が分かります。
再起動やlazy unmountに逃げる前に、まずfuserで原因プロセスを可視化する習慣をつけてください。
| やりたいこと | コマンド |
|---|---|
| ディレクトリを掴むプロセスを表示 | fuser -v /mnt |
| マウントポイント配下を全て調査 | fuser -vm /mnt |
| 対話的にプロセスを終了させる | fuser -k -i -TERM -m /mnt |
| ポート占有プロセスを特定 | sudo fuser -v 80/tcp |
| 設定ファイルを開くデーモンにSIGHUP | sudo fuser -k -HUP /etc/nginx/nginx.conf |
| パッケージインストール(RHEL系) | sudo dnf install psmisc |
「target is busyに焦らず対処できる自信がありますか?」
fuserは現場で頻発するトラブルに即効性のあるコマンドですが、本当に重要なのはその先です。マウント設計、プロセス管理、ポート運用まで、原因を最短で切り分けて直せる体系的な知識が実務の自信につながります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます