プロセス管理 中級

lsofコマンド入門 ― 開いているファイルとネットワーク接続を調べる

lsof(List Open Files)コマンドを使って、プロセスが開いているファイルやソケット、ポートの使用状況を調査する方法を学ぶ。トラブルシューティングに必須の診断コマンド。

lsof(List Open Files)は、システム上で現在開かれているファイルの一覧を表示するコマンドです。 Linuxでは「すべてはファイルである」という設計思想のもと、通常のファイルだけでなく、ネットワークソケット・デバイス・パイプなども「ファイル」として扱われます。 lsof はこれらすべてを調べられるため、トラブルシューティングや診断に欠かせないツールです。


基本構文

lsof [オプション] [対象]

オプションなしで実行すると、全プロセスが開いている全ファイルを出力します(非常に大量になるため、通常は絞り込みオプションと組み合わせます)。


ステップ1:出力の読み方

まず基本的な出力を見てみましょう。

lsof | head -5
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd    1   root  cwd    DIR    8,1     4096    2 /
systemd    1   root  rtd    DIR    8,1     4096    2 /
systemd    1   root  txt    REG    8,1  1629360  123 /lib/systemd/systemd
bash     512   user  mem    REG    8,1  1849064  456 /lib/x86_64-linux-gnu/libc.so.6

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

列説明
COMMANDコマンド名
PIDプロセスID
USER実行ユーザー
FDファイルディスクリプタ(cwd=カレントディレクトリ, txt=実行ファイル, mem=メモリマップ, 数字=FD番号)
TYPEファイル種別(REG=通常ファイル, DIR=ディレクトリ, IPv4/IPv6=ソケット など)
NAMEファイルパスまたはアドレス

ステップ2:特定のファイルを開いているプロセスを調べる

lsof /var/log/syslog
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 789   root    4w   REG    8,1   204800  98765 /var/log/syslog

「このファイルは誰が使っているか?」を確認するのに便利です。 ファイルが削除できない・アンマウントできないときに特に役立ちます。


ステップ3:特定のポートを使用しているプロセスを調べる

-i オプションでネットワーク接続を絞り込めます。

# ポート番号で絞り込む
lsof -i :80

# プロトコルとポートで絞り込む
lsof -i tcp:22

# 特定のホストへの接続を調べる
lsof -i @192.168.1.1

例:ポート8080を使っているプロセスを確認する

lsof -i :8080
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node     1234   user   23u  IPv4  56789      0t0  TCP *:8080 (LISTEN)

「このポートはすでに使われている」というエラーが出たときに有効です。


ステップ4:特定のプロセスが開いているファイルを調べる

-p オプションでPIDを指定します。

# PIDが1234のプロセスの開いているファイルを表示
lsof -p 1234

# コマンド名で絞り込む(-c オプション)
lsof -c nginx
# 特定ユーザーのプロセスを調べる
lsof -u username

ステップ5:ネットワーク接続の一覧を確認する

# すべてのネットワーク接続を表示
lsof -i

# TCP接続のみ表示
lsof -i tcp

# LISTEN状態のポートのみ表示
lsof -i -sTCP:LISTEN

ss コマンドや netstat の代わりとして使えます。


ステップ6:削除済みファイルを開いているプロセスを探す

ファイルを削除してもプロセスが開き続けると、ディスク容量が解放されません。 そのようなプロセスは以下で見つけられます。

lsof | grep deleted
java    5678   user   10u   REG    8,1  2097152  99999 /tmp/app.log (deleted)

このような場合、該当プロセスを再起動するとディスク容量が解放されます。


よく使うオプションまとめ

オプション説明
-i :ポート番号指定ポートを使うプロセスを表示
-i tcp / -i udpTCP/UDP接続を表示
-p PID指定PIDのプロセスを表示
-c コマンド名コマンド名で絞り込み
-u ユーザー名指定ユーザーのプロセスを表示
-nホスト名をIPアドレスで表示(高速化)
-Pポートを番号で表示(サービス名に変換しない)
+D ディレクトリディレクトリ以下のファイルを開いているプロセスを表示

練習問題

以下の問題を実際にコマンドを打って試してみましょう。

問題1

ポート 22(SSH)を開いているプロセスを確認するコマンドを書いてください。

問題2

/etc/passwd ファイルを現在開いているプロセスを調べるコマンドを書いてください。

問題3

現在リッスン(待ち受け)状態にあるTCPポートをすべて表示するコマンドを書いてください。

問題4

自分のユーザー名(例:user)が開いているネットワーク接続を確認するコマンドを書いてください。


答え

問題1

lsof -i :22

または -n -P を追加すると名前解決をスキップして高速に表示できます。

lsof -i :22 -n -P

問題2

lsof /etc/passwd

問題3

lsof -i tcp -sTCP:LISTEN -n -P

問題4

lsof -u user -i

まとめ

lsof は次のような場面で活躍します。

  • 「このポートは使用中」エラー → lsof -i :ポート番号 で犯人を特定
  • ディスク容量が減らない → lsof | grep deleted で削除済みファイルを探す
  • プロセスが何を開いているか確認 → lsof -p PID で調査
  • 特定ファイルへのアクセスを監視 → lsof ファイルパス で確認

システム管理・デバッグの現場で非常に役立つコマンドなので、ぜひ身につけておきましょう。