MENU

削除・アンマウントできないファイルやデバイスを使用中のプロセスから特定する手順

ファイルを削除しようとしたら「Device or resource busy」が返ってきた、あるいは umount を実行したら「target is busy」と表示されてアンマウントできない――こうした状況はサーバー運用でよく遭遇します。いずれも、対象のファイルやデバイスをどこかのプロセスが掴んだままになっていることが原因です。まずは「どのプロセスが使っているか」を特定することが、解決への第一歩になります。

目次

ファイルやデバイスが「使用中」になる仕組み

Linux では、プロセスがファイルを開くとカーネルがそのファイルへの参照を保持します。ファイルを削除するコマンド(rm など)はディレクトリエントリを取り除きますが、プロセスがファイルディスクリプタを握り続けている限り、実体(inode)はディスク上に残ります。ストレージデバイスのアンマウントについても同様で、マウントポイント配下に開いているファイルや作業ディレクトリが存在すると、カーネルはアンマウントを拒否します。

「誰が使っているのか分からない」という状態のままでは対処が取れません。まず対象を特定してから、次のアクションを判断する流れが基本です。

lsof でファイルを使用中のプロセスを調べる

lsof(list open files)は、現在開かれているファイルとそれを開いているプロセスの対応を表示するコマンドです。特定のファイルパスを引数に渡すと、そのファイルを使用しているプロセスだけを絞り込めます。

lsof /path/to/target/file

出力は次のような形式になります(想定例)。

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python3 1234  appuser   3r   REG    8,1    10240  789 /path/to/target/file

各列の意味は次のとおりです。

  • COMMAND:プロセス名
  • PID:プロセスID
  • USER:実行ユーザー
  • FD:ファイルディスクリプタの種別(r は読み取り、w は書き込み)
  • NAME:開いているファイルパス

PID が分かったら、次のコマンドでそのプロセスの詳細を確認できます。

ps aux | grep 1234

fuser で素早くプロセスを確認する

fuser は指定したファイルやディレクトリを使用しているプロセスの PID をシンプルに返します。lsof より出力が短いため、PID だけを素早く確認したいときに向いています。

fuser /path/to/target/file

-v オプションを付けると、プロセス名やアクセス種別も合わせて表示されます。

fuser -v /path/to/target/file

出力例(想定例)は次のとおりです。

                     USER        PID ACCESS COMMAND
/path/to/target/file:
                     appuser    1234 f....  python3

ACCESS 列の主な記号の意味は次のとおりです。

  • f:通常のファイルオープン
  • F:書き込みでオープン中
  • c:カレントディレクトリとして使用中
  • m:メモリマップまたは共有ライブラリとして使用中

アンマウントできないマウントポイントを調べる

デバイスや NFS マウントをアンマウントしようとして「target is busy」が出る場合は、マウントポイント配下のどこかにプロセスが存在します。マウントポイント全体を対象にするには、lsof にそのパスを渡します。

lsof /mnt/data

fuser では -m オプションを付けることで、マウントポイント以下のすべてのファイルを対象に検索できます。

fuser -mv /mnt/data

シェルがそのマウントポイント配下をカレントディレクトリにしているケースも見落としがちです。次のコマンドで対象プロセスのカレントディレクトリを確認できます。

ls -la /proc/<PID>/cwd

プロセスを特定したあとの対処

PID が判明したら、次の手順で対処を進めます。

  1. プロセスの内容を確認する:ps aux | grep <PID> や cat /proc/<PID>/cmdline で何のプロセスかを把握します。
  2. 安全に停止できるか判断する:systemd サービスであれば systemctl stop <サービス名> で正常に停止します。単発のプロセスであれば kill <PID> で SIGTERM を送ります。
  3. 停止しない場合:kill -9 <PID> で SIGKILL を送ります。ただしファイルへの書き込み途中だとデータが破損する恐れがあるため、最終手段として扱います。

アンマウントの場合は、プロセスを停止してから再度 umount を実行します。すぐに停止できないプロセスがある場合は umount -l(遅延アンマウント)を使う方法もあります。これはマウントポイントをディレクトリツリーから即座に切り離しますが、既存のファイルアクセスがすべて終わるまで実体は残る動作になります。本番環境では影響範囲を確認してから使うかどうか判断してください。

よくあるつまずきと注意点

lsof や fuser がインストールされていない

ディストリビューションによっては標準でインストールされていないことがあります。次のコマンドでインストールできます。

# Debian/Ubuntu 系
sudo apt install lsof psmisc

# RHEL / AlmaLinux / Rocky Linux 系
sudo dnf install lsof psmisc

fuser は psmisc パッケージに含まれています。

削除済みファイルがディスクを占有し続けている

lsof の出力でファイル名の末尾に (deleted) と表示されるケースがあります。これはファイルがディレクトリエントリから削除されても、プロセスがファイルディスクリプタを保持しているためディスク領域が解放されていない状態です。次のコマンドで一覧を確認できます。

lsof | grep deleted

このような場合は、該当プロセスを再起動することでファイルディスクリプタが閉じられ、ディスク領域が解放されます。ログファイルが肥大化したままになっているサービスで起きやすいパターンです。

root 権限がないと他ユーザーのプロセスが見えない

一般ユーザー権限で lsof を実行すると、他のユーザーのプロセスが使っているファイルは表示されません。sudo を付けて実行するとすべてのプロセスの情報が取得できます。

sudo lsof /path/to/target/file

出力が空でも「使われていない」とは限らない点に注意が必要です。権限不足で情報が取得できていないケースがあるため、疑わしいときは sudo を付けて再確認する習慣をつけておくと調査の見落としを防げます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次