萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux lsof 指令完全掌握:追蹤檔案描述符、網路連線與進程關係

lsof(List Open Files)是 Linux 系統可見度最高的工具之一。在「一切皆檔案」的 Unix 哲學下,lsof 能揭示進程與檔案、網路連線、裝置、管道的所有關係。無論是排查埠口佔用、尋找記憶體洩漏、恢復誤刪檔案、還是安全審計,lsof 都是首選利器。

核心概念:檔案描述符與類型

每個進程擁有獨立的檔案描述符表(0=stdin, 1=stdout, 2=stderr),lsof 顯示的 FD 欄位含義:

FD 值含義
cwd當前工作目錄
txt程式碼段(執行檔、共享庫)
mem記憶體映射檔案
mmap記憶體映射裝置
rtd根目錄
0/1/2標準輸入/輸出/錯誤
數字+u/r/w一般檔案描述符 + 讀寫模式

TYPE 欄位常見值:

指令格式與核心參數

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 專注網路層面

常見誤區

  1. 以為 lsof 顯示即時狀態:實際是掃描 /proc 快照,有毫秒級延遲
  2. 忽略 kernel threads:kthreadd、kworker 等無 FD,不顯示
  3. 誤判 deleted 檔案:(deleted) 標記只表示目錄項已除,資料仍在磁碟

lsof 替代工具對比

TYPE含義
REG一般檔案
DIR目錄
CHR字元裝置
BLK區塊裝置
FIFO命名管道
UNIXUnix 域套接字
IPv4/IPv6網路套接字
sock未知類型套接字
工具優勢劣勢適用場景
lsof全面、支援所有檔案類型、輸出豐富較慢、輸出冗長綜合診斷、檔案恢復
ss極快、核心原生、支援篩選表達式僅限套接字網路連線分析、高併發環境
netstat傳統、廣泛相容已棄用、慢、功能少舊系統相容
fuser專注檔案/埠口佔用、可直接殺進程資訊較少快速釋放埠口、解除掛載
/proc 直接讀取無依賴、最原始資料解析複雜極簡環境、容器、嵌入式

lsof 指令示意圖

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

copyright © 萬盛學電腦網 all rights reserved