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/ 把檔案救回來。
(這需要一點運氣和技巧)。