Linux lsof (List Open Files) 指令詳解

在 Linux 中「一切皆檔案」(Everything is a file)。 lsof 是一個可以列出當前系統開啟檔案的工具。 它的功能非常強大,最常用來解決「這個檔案被誰鎖住了?」或是「這個 Port 被誰佔用了?」這類問題。

常用指令

1. 誰在用這個檔案?

想刪除或卸載某個檔案/目錄,卻出現 Device or resource busy? 用 lsof 抓出兇手。

lsof /var/log/syslog

2. 誰在佔用這個 Port? (-i)

這跟 ss -tulpn 很像,但 lsof 可以看到更多檔案層面的細節。

# 查看 TCP Port 80
sudo lsof -i TCP:80

# 查看 UDP Port 53
sudo lsof -i UDP:53

3. 列出所有監聽中 (Listening) 的 Port

這是一個非常實用的組合技。 建議加上 -P (不轉譯 Port name) 和 -n (不轉譯 Hostname) 來加快速度。

sudo lsof -i -P -n | grep LISTEN

4. 只列出 IPv4 或 IPv6 連線

# 只列出 IPv4
lsof -i 4

# 只列出 IPv6
lsof -i 6

5. 列出某個使用者開啟的檔案 (-u)

lsof -u miko

6. 列出某個 Process 開啟的檔案 (-p)

如果你知道 PID,想看它到底讀寫了哪些檔案:

lsof -p 1234

7. 復原被誤刪的檔案 (進階技巧)

如果一個檔案被 rm 刪除了,但還有 Process 開著它 (Open File Descriptor),其實硬碟空間還沒被釋放。 你可以用 lsof 找到該 Process,並透過 /proc/PID/fd/ 把檔案救回來。 (這需要一點運氣和技巧)。