「device is busyでumountできない。どのプロセスがファイルを掴んでいるの?」
サーバー運用で「このファイルは誰が使っている?」「このポートを掴んでいるプロセスは?」と調べたい場面は頻繁に訪れます。
この記事では、
lsof コマンドの実践的な使い方を解説します。ファイルを開いているプロセスの特定、特定ユーザーやPIDの絞り込み、ネットワーク接続・ポートの調査から、「device is busy」「Permission denied」のトラブルシュートまで、現場で必要になる操作を網羅しました。
※ 動作確認環境:RHEL 9.4 / Ubuntu 24.04 LTS
この記事のポイント
・lsof はLinuxで開いているファイルを一覧表示するコマンド
・lsof -i :ポート番号 で特定ポートの使用プロセスを即座に特定できる
・lsof | grep deleted で削除済みなのにディスクを消費しているファイルを発見できる
・「device is busy」はlsofでプロセスを特定してから安全に対処する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
lsofとは? Linuxで開いているファイルを一覧表示するコマンド
lsof(list open files)は、システム上で現在開かれているファイルと、そのファイルを開いているプロセスの対応関係を表示するコマンドです。Linuxでは「すべてはファイル」という設計思想があり、通常のファイルだけでなく、ネットワークソケット、パイプ、デバイスファイルもファイルとして扱われます。つまり lsof は、ファイル操作の調査だけでなく、ネットワーク接続やプロセス間通信の調査にも使える万能ツールです。
実務では以下のような場面で使います。
・「device is busy」でumountできない時:どのプロセスがマウントポイント配下のファイルを掴んでいるか特定する
・ポートの使用状況を調べたい時:80番ポートを使っているプロセスを特定する
・ディスク容量が減らない時:削除済みだがプロセスが掴んだままのファイルを見つける
・セキュリティ調査:不審なプロセスがどのファイルやネットワーク接続を開いているか確認する
lsofは多くのディストリビューションにプリインストールされていますが、入っていない場合は
dnf install lsof(RHEL系)または apt install lsof(Debian/Ubuntu系)でインストールしてください。lsofの基本的な使い方
1. 開いているファイルを全件表示する(lsof)
引数なしでlsof を実行すると、システム上で開かれている全ファイルが一覧表示されます。# 開いているファイルを全件表示(root権限推奨) # sudo lsof | head -20 COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 224 128 / systemd 1 root rtd DIR 253,0 224 128 / systemd 1 root txt REG 253,0 1849992 33782835 /usr/lib/systemd/systemd systemd 1 root mem REG 253,0 629384 33604740 /usr/lib64/libudev.so.1.7.7 sshd 1234 root cwd DIR 253,0 224 128 / sshd 1234 root 3u IPv4 18923 0t0 TCP *:22 (LISTEN) httpd 5678 apache cwd DIR 253,0 224 128 / httpd 5678 apache 4u IPv6 20145 0t0 TCP *:80 (LISTEN)
出力の各カラムの意味は次の通りです。
・COMMAND:ファイルを開いているコマンド(プロセス)名
・PID:プロセスID
・USER:プロセスの実行ユーザー
・FD:ファイルディスクリプタ(cwd=カレントディレクトリ、txt=実行ファイル、数字u=読み書き可能、数字r=読み取り専用)
・TYPE:ファイルの種類(REG=通常ファイル、DIR=ディレクトリ、IPv4/IPv6=ネットワーク接続)
・NAME:ファイルパスまたはネットワーク情報
2. 特定ファイルを開いているプロセスを調べる(lsof ファイルパス)
引数にファイルパスを指定すると、そのファイルを開いているプロセスだけが表示されます。# /var/log/messages を開いているプロセスを確認 # sudo lsof /var/log/messages COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 1456 root 7w REG 253,0 1245678 1048623 /var/log/messages
3. 特定プロセスが開いているファイル一覧(lsof -p PID)
-p オプションにPIDを指定すると、そのプロセスが開いているファイルの一覧を確認できます。# PID 5678(Apache)が開いているファイルを確認 # sudo lsof -p 5678 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 5678 apache cwd DIR 253,0 224 128 / httpd 5678 apache txt REG 253,0 1209528 1048612 /usr/sbin/httpd httpd 5678 apache mem REG 253,0 281784 135468 /usr/lib64/libnss_files.so.2 httpd 5678 apache 4u IPv6 20145 0t0 TCP *:80 (LISTEN) httpd 5678 apache 7w REG 253,0 345210 1048701 /var/log/httpd/access_log httpd 5678 apache 8w REG 253,0 52340 1048702 /var/log/httpd/error_log
プロセスのPIDが分からない場合は、psコマンドで先に確認してください。
4. 特定ユーザーが開いているファイル一覧(lsof -u ユーザー名)
-u オプションでユーザー名を指定すると、そのユーザーのプロセスが開いているファイルを一覧表示できます。# apacheユーザーが開いているファイルを確認 # sudo lsof -u apache COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 5678 apache cwd DIR 253,0 224 128 / httpd 5678 apache 4u IPv6 20145 0t0 TCP *:80 (LISTEN) httpd 5679 apache cwd DIR 253,0 224 128 / httpd 5679 apache 4u IPv6 20145 0t0 TCP *:80 (LISTEN)
^ を付けます。# root以外のユーザーが開いているファイルを表示 # sudo lsof -u ^root | head -10
ネットワーク接続・ポートの調査
lsofはネットワーク接続の調査にも威力を発揮します。ssコマンドと並んで、ポートの使用状況やネットワーク接続を確認する定番の手法です。5. ネットワーク接続を一覧表示する(lsof -i)
-i オプションを付けると、ネットワーク関連のファイル(ソケット)だけが抽出されます。# ネットワーク接続の一覧を表示 # sudo lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1234 root 3u IPv4 18923 0t0 TCP *:ssh (LISTEN) sshd 1234 root 4u IPv6 18925 0t0 TCP *:ssh (LISTEN) httpd 5678 apache 4u IPv6 20145 0t0 TCP *:http (LISTEN) httpd 5678 apache 5u IPv6 20147 0t0 TCP *:https (LISTEN) sshd 8901 root 3u IPv4 25678 0t0 TCP sv01.example.com:ssh->192.168.1.xxx:52341 (ESTABLISHED) postfix 3456 root 6u IPv4 15678 0t0 TCP 127.0.0.1:smtp (LISTEN)
6. 特定ポートの使用プロセスを確認する(lsof -i :ポート番号)
「このポートを使っているのは何のプロセス?」という疑問に一発で答えられるのが-i :ポート番号 です。# 80番ポートを使用しているプロセスを確認 # sudo lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 5678 apache 4u IPv6 20145 0t0 TCP *:http (LISTEN) httpd 5679 apache 4u IPv6 20145 0t0 TCP *:http (LISTEN) httpd 5680 apache 4u IPv6 20145 0t0 TCP *:http (LISTEN)
プロトコルやアドレスで更に絞り込むこともできます。
# TCPの443番ポートだけに絞り込む # sudo lsof -i TCP:443 # 特定のリモートホストとの接続を確認 # sudo lsof -i @192.168.1.100
応用・実務Tips
7. 削除済みだがプロセスが掴んでいるファイルを確認する
「ログファイルを削除したのにディスク容量が減らない」は運用現場でよく遭遇するトラブルです。Linuxでは、ファイルを削除(rm)しても、そのファイルを開いているプロセスが存在する限り、実際のディスク領域は解放されません。この状態のファイルは deleted と表示されます。
# 削除済みだがプロセスが掴んでいるファイルを検索 # sudo lsof | grep deleted httpd 5678 apache 12w REG 253,0 2147483648 1048723 /var/log/httpd/access_log.old (deleted) java 9012 tomcat 5w REG 253,0 536870912 1048801 /opt/tomcat/logs/catalina.out (deleted)
対処方法は、ファイルを掴んでいるプロセスを再起動するか、プロセスのファイルディスクリプタを空にすることです。
# 方法1: プロセスを再起動して解放する(推奨) # systemctl restart httpd # 方法2: プロセスを停止できない場合、FDを空にする(応急処置) # ファイルディスクリプタのパスは /proc/PID/fd/FD番号 # : > /proc/5678/fd/12
8. 複数条件の組み合わせ
lsofはデフォルトでOR条件(いずれかに一致)で動作します。AND条件にしたい場合は-a オプションを使います。# apacheユーザーかつネットワーク接続のみ表示(AND条件) # sudo lsof -u apache -i -a COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 5678 apache 4u IPv6 20145 0t0 TCP *:http (LISTEN) httpd 5678 apache 5u IPv6 20147 0t0 TCP *:https (LISTEN)
9. リピートモードで継続監視する
-r オプションを使うと、指定秒間隔で繰り返し実行できます。# 3秒間隔で80番ポートの接続状況を監視 # sudo lsof -i :80 -r 3
「device is busy」のトラブルシュートと「Permission denied」の対処
10. 「device is busy」でumountできない場合
USBドライブやNFSマウントを解除しようとして「device is busy」と表示された場合、そのマウントポイント配下でファイルを開いているプロセスがいます。# umountが失敗する # umount /mnt/usb umount: /mnt/usb: target is busy. # マウントポイント配下のファイルを使っているプロセスを特定 # sudo lsof +D /mnt/usb COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 3456 user1 cwd DIR 8,1 4096 2 /mnt/usb vim 3457 user1 4u REG 8,1 12345 128 /mnt/usb/report.txt
対処手順は以下の通りです。
・そのユーザーに作業終了を依頼する(推奨)
・プロセスを終了する場合は
kill 3457 でvimを、kill 3456 でbashを終了する・それでも解放されない場合は
fuser -km /mnt/usb で強制終了する(要注意:データ消失のリスクあり)+D(大文字D)はディレクトリ配下を再帰的に検索します。ファイル数が多い場合は時間がかかるため、+d(小文字d)で直下のみ検索する方法もあります。11. 「Permission denied」の対処
lsofを一般ユーザーで実行すると、他ユーザーのプロセス情報が表示されません。# 一般ユーザーで実行すると自分のプロセスしか見えない $ lsof -i :80 (何も表示されない、またはPermission deniedが発生) # root権限で実行すれば全プロセスの情報が見られる # sudo lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 5678 apache 4u IPv6 20145 0t0 TCP *:http (LISTEN)
実務では
sudo lsof で実行するのが鉄則です。本記事のまとめ
lsofはファイルとプロセスの関係を調べる万能ツールです。以下のコマンドを覚えておけば、実務の大半の場面に対応できます。| やりたいこと | コマンド |
|---|---|
| 開いているファイルを全件表示 | sudo lsof |
| 特定ファイルを開いているプロセスを調べる | sudo lsof /var/log/messages |
| 特定プロセスが開いているファイル一覧 | sudo lsof -p PID |
| 特定ユーザーのファイル一覧 | sudo lsof -u ユーザー名 |
| ネットワーク接続の一覧表示 | sudo lsof -i |
| 特定ポートの使用プロセス確認 | sudo lsof -i :ポート番号 |
| 削除済みファイルの検索 | sudo lsof | grep deleted |
| マウントポイント配下の使用プロセス特定 | sudo lsof +D /mnt/usb |
| AND条件で複数フィルタを組み合わせる | sudo lsof -u ユーザー名 -i -a |
| 継続監視(リピートモード) | sudo lsof -i :ポート番号 -r 秒数 |
ポート確認やプロセス調査で、毎回ネット検索していませんか?
lsofのようなトラブルシュートコマンドは、体系的に身につけてこそ実務で力を発揮します。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
