はじめに

こんにちは!今回はlsofコマンドについて解説します。

lsofは、開いているファイルを一覧表示するコマンドです。“list open files"の略ですね。ポート競合の調査やプロセスが何のファイルを使っているか確認する場合に便利。サーバー管理やトラブルシューティングの現場で毎日使われるコマンドです。

「どのプロセスがどのファイルを開いているか調べる機」って感じです。

lsofコマンドとは

lsofは、Linuxシステムで開かれているすべてのファイル、ソケット、ディレクトリを一覧表示するコマンドです。

ファイルだけでなく、ネットワークソケット、パイプ、デバイスなど、Linuxの"ファイル"として扱われるすべてのものが対象。特定のプロセスが開いているファイル、特定のポートを使用しているプロセス、削除されたが開かれたままのファイルなど、様々な調査ができます。システムの状態を把握するのに欠かせないツールですね。

基本構文

1
lsof [オプション] [条件]

オプションなしで実行すると、すべての開いているファイルが表示されます。

主なオプション

オプション 説明
-p PID 指定したプロセスIDで開かれているファイル
-u ユーザー 指定したユーザーで開かれているファイル
-c コマンド 指定したコマンドで開かれているファイル
-i ネットワークファイルのみ表示
-i :ポート番号 指定したポート番号を使用しているプロセス
-d FD 指定したファイルディスクリプタ
+D ディレクトリ 指定したディレクトリ配下のファイル
-n ホスト名を表示しない(高速化)
-a 複数条件のAND(デフォルトはOR)
-t PIDのみ表示

使用例

例1: すべてのオープンファイルを表示

1
lsof | head -20

実行結果:

1
2
3
4
5
6
COMMAND    PID  USER   FD   TYPE             DEVICE  SIZE/OFF     NODE NAME
init         1  root  cwd    DIR                3,2     4096        2 /
systemd      1  root  rtd    DIR                3,2     4096        2 /
systemd      1  root  txt    REG                3,2  1234567   456789 /lib/systemd/systemd
systemd      1  root  mem    REG                3,2   567890   123456 /lib/x86_64-linux-gnu/libc.so.6
(...省略...)

全プロセスのオープンファイルを表示。数が多いため通常は制限します。

例2: 特定プロセスのオープンファイル

1
lsof -p 1234

実行結果:

1
2
3
4
5
COMMAND  PID  USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
nginx   1234  root  cwd    DIR                3,2     4096       2 /
nginx   1234  root  rtd    DIR                3,2     4096       2 /
nginx   1234  root  txt    REG                3,2   456789  123456 /usr/sbin/nginx
nginx   1234  root  mem    REG                3,2   567890  234567 /lib/libpcre.so.3

プロセスID 1234 が開いているファイル一覧。

例3: ユーザーが開いているファイル

1
lsof -u www-data

実行結果:

1
2
3
4
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
apache2   1234 www-data    4u   IPv4              10 0t0    54321 TCP 0.0.0.0:80
apache2   1234 www-data   20r   REG                3,2   123456   567890 /var/www/html/index.php
apache2   1234 www-data   21w   REG                3,2        0   123456 /var/log/apache2/access.log

www-dataユーザーが開いているファイル。Webサーバーのファイルアクセス確認に便利。

例4: 特定ポートを使用しているプロセス

1
lsof -i :80

実行結果:

1
2
3
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234 root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)
nginx   1234 root    7u  IPv4  54321      0t0  TCP *:http (LISTEN)

ポート80 を開いているプロセス。ポート競合調査に最適。

例5: コマンド名で検索

1
lsof -c nginx

実行結果:

1
2
3
4
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
nginx   1234 root  cwd    DIR                3,2     4096       2 /
nginx   1234 root  rtd    DIR                3,2     4096       2 /
nginx   5678 root    4u  IPv4              10 0t0    54321 TCP *:http (LISTEN)

nginxコマンドで実行されているプロセスのオープンファイル。

例6: ディレクトリ配下のオープンファイル

1
lsof +D /var/log

実行結果:

1
2
3
4
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
syslog    1234  root    5w   REG    3,2  567890  123456 /var/log/syslog
apache2   1234 www-data 5w   REG    3,2       0  234567 /var/log/apache2/access.log
nginx     5678  root    8w   REG    3,2    8901  345678 /var/log/nginx/error.log

/var/logディレクトリ配下でオープンしているファイル。

例7: PIDのみ表示

1
lsof -t -i :3000

実行結果:

1
2
1234
5678

ポート 3000 を使用しているプロセスのPIDのみ表示。スクリプトでの利用に便利。

例8: ネットワークファイルのみ表示

1
lsof -i -u www-data

実行結果:

1
2
3
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1234 www-data    4u  IPv4  10 0t0    54321 TCP 0.0.0.0:80 (LISTEN)
apache2   1234 www-data   10u  IPv4  11 0t0    54322 TCP 192.168.1.10:34567->example.com:443 (ESTABLISHED)

-iフラグでネットワークファイルのみ表示。

例9: TCP接続のみ表示

1
lsof -i TCP

実行結果:

1
2
3
4
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1234 root    3u  IPv4  10 0t0    54321 TCP 0.0.0.0:22 (LISTEN)
nginx     5678 root    6u  IPv4  12 0t0    54322 TCP 0.0.0.0:80 (LISTEN)
mysql     7890 mysql   22u IPv4  14 0t0    54323 TCP 127.0.0.1:3306 (LISTEN)

TCPソケットのみ表示。ネットワークサービスの確認。

例10: 削除されたがオープンなファイル

1
lsof | grep deleted

実行結果:

1
nginx    1234 root   5w   REG   3,2  123456  456789 /var/log/nginx/access.log (deleted)

削除されたがプロセスが開いたままのファイル。ディスク容量の大きな削除ファイルを発見可能。

Tips・注意点

大量の出力を高速化

1
lsof -n -P

-nでホスト名解決を省略、-Pでポート番号を数値で表示。大幅に高速化。

複数条件の組み合わせ

1
lsof -p 1234 -u root

デフォルトでOR条件。AND条件にするには-aを使用。

ファイアウォール等での確認

1
sudo lsof -i

lsofでネットワーク情報を見るにはsudoが必要な場合があります。

実践的な使い方

ポート競合の解決

1
2
3
4
5
6
7
8
9
#!/bin/bash
PORT=8080
PID=$(lsof -t -i :$PORT)
if [ ! -z "$PID" ]; then
  echo "Port $PORT is used by PID $PID"
  lsof -p $PID
else
  echo "Port $PORT is available"
fi

開発中のポート競合を調査・解決。

ディスク容量の確認

1
lsof | grep deleted | awk '{print $7}' | awk '{total+=$1} END {print "Total: " total/1024/1024 "MB"}'

削除されたファイルの合計容量を確認。ディスク空き容量を確保。

プロセスの使用リソース確認

1
lsof -p $$ | wc -l

現在のシェルが開いているファイル数を表示。

まとめ

lsofコマンドのポイント:

  • 開いているファイルとソケットを一覧表示
  • -p: プロセスID で検索
  • -u: ユーザーで検索
  • -i: ネットワークファイル表示
  • -i :ポート: ポート使用プロセス確認
  • -c: コマンド名で検索
  • +D: ディレクトリ配下を検索
  • -t: PIDのみ表示(スクリプト用)
  • よく使う組み合わせ: lsof -i :ポート, lsof -p PID, lsof -u ユーザー

トラブルシューティングとシステム監視の強力なツール。ポート競合やファイルロック問題の調査に欠かせません!