| TYPE | 含義 |
| REG | 一般檔案 |
| DIR | 目錄 |
| CHR | 字元裝置 |
| BLK | 區塊裝置 |
| FIFO | 命名管道 |
| UNIX | Unix 域套接字 |
| IPv4/IPv6 | 網路套接字 |
| sock | 未知類型套接字 |
指令格式與核心參數
lsof [選項] [檔案/目錄]
-p PID # 指定進程 ID
-c 進程名 # 指定進程名稱(支援正則)
-u 用戶 # 指定用戶
-g 群組 ID # 指定進程群組
-i [條件] # 網路連線過濾(核心功能)
-d FD # 指定檔案描述符編號
+d 目錄 # 列出目錄下開啟的檔案(不遞歸)
+D 目錄 # 遞歸列出目錄下開啟的檔案
-n # 不解析主機名(加速)
-P # 不解析埠口服務名(加速)
-r 秒數 # 重複模式,每隔指定秒數重新整理
-F 格式 # 機器可解析輸出(腳本友好)
網路連線過濾神技:-i 參數詳解
# 所有網路連線
lsof -i
# 特定協議
lsof -i tcp
lsof -i udp
# 特定埠口
lsof -i :80
lsof -i :22
lsof -i :80,443,8080
# 特定 IP
lsof -i @192.168.1.100
lsof -i @192.168.1.100:80
# 組合條件
lsof -i tcp@192.168.1.100:80
lsof -i udp@[2001:db8::1]:53
# IPv4/IPv6 限定
lsof -i 4
lsof -i 6
實戰場景全景圖
場景 1:排查埠口被佔用
# 經典:誰佔用了 8080 埠?
lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1234 user 123u IPv6 12345 0t0 TCP *:8080 (LISTEN)
# 立即殺掉
kill -9 1234
場景 2:找出進程打開的所有檔案
lsof -p 1234
# 或
lsof -c java
場景 3:恢復誤刪但仍被進程持有的檔案
# 1. 找出持有已刪除檔案的進程
lsof | grep deleted
# 輸出範例:
# myapp 5678 user 4u REG 253,0 104857600 12 /var/log/app.log (deleted)
# 2. 從 /proc 恢復
# PID=5678, FD=4
cp /proc/5678/fd/4 /tmp/recovered_app.log
原理:檔案被刪除只是目錄項移除,inode 仍存在,只要進程持有開啟描述符,資料就在磁碟上。
場景 4:分析進程網路連線狀態
# 查看特定進程的所有網路連線
lsof -p 1234 -i -a
# -a 表示 AND 邏輯(同時滿足 -p 和 -i)
# 統計連線狀態
lsof -i | awk '{print $NF}' | sort | uniq -c | sort -rn
場景 5:找出佔用掛載點的進程(umount 失效時)
lsof /mnt/data
# 或
lsof +D /mnt/data
場景 6:安全審計 - 可疑網路連線
# 列出所有非預期的外連
lsof -i -n -P | grep -v -E ':(22|80|443|53|123|25) ' | grep ESTABLISHED
# 找出連往可疑 IP 的進程
lsof -i @203.0.113.100
場景 7:檔案描述符洩漏偵測
# 統計進程開啟檔案數
lsof -p 1234 | wc -l
# 監控 FD 數量變化
watch -n 1 'lsof -p 1234 | wc -l'
# 系統層級 FD 使用
cat /proc/sys/fs/file-nr
# 輸出:已分配 未分配 最大值
輸出格式化與腳本整合
機器可解析格式(-F)
lsof -F pcn -p 1234
# 輸出:
# p1234
# cmyapp
# n/var/log/app.log
# 格式:p=PID, c=命令名, n=檔案名...
自訂輸出欄位
# 僅顯示 PID、命令、FD、類型、檔案名
lsof -p 1234 --format="pid cmd fd type name"
# CSV 輸出(需較新版本)
lsof -p 1234 -F 0 | tr '\0' ','
進階技巧與避坑指南
權限問題
- 非 root 執行只能看到自己擁有的進程
- 查看所有進程需
sudo lsof 或具備 CAP_SYS_ADMIN
- 容器中執行
lsof 看到的是容器命名空間視角
效能考量
lsof 掃描 /proc 目錄,進程極多時較慢
- 加
-n -P 禁用 DNS/服務名解析,大幅加速
- 大量進程環境建議使用
ss 或 netstat 專注網路層面
常見誤區
- 以為 lsof 顯示即時狀態:實際是掃描
/proc 快照,有毫秒級延遲
- 忽略 kernel threads:
kthreadd、kworker 等無 FD,不顯示
- 誤判 deleted 檔案:
(deleted) 標記只表示目錄項已除,資料仍在磁碟
lsof 替代工具對比
| 工具 | 優勢 | 劣勢 | 適用場景 |
| lsof | 全面、支援所有檔案類型、輸出豐富 | 較慢、輸出冗長 | 綜合診斷、檔案恢復 |
| ss | 極快、核心原生、支援篩選表達式 | 僅限套接字 | 網路連線分析、高併發環境 |
| netstat | 傳統、廣泛相容 | 已棄用、慢、功能少 | 舊系統相容 |
| fuser | 專注檔案/埠口佔用、可直接殺進程 | 資訊較少 | 快速釋放埠口、解除掛載 |
| /proc 直接讀取 | 無依賴、最原始資料 | 解析複雜 | 極簡環境、容器、嵌入式 |

lsof 是系統內部關係的 X 光機。熟練掌握 -i 過濾語法、-F 機器輸出、/proc 恢復技巧,能在故障現場幾秒內定位問題核心。建議將常用查詢封裝為別名或腳本,如 alias port='lsof -i -n -P',提升現場排錯效率。
copyright ©
萬盛學電腦網 all rights reserved