lsof 進階:找出佔用資源的程序
在 Linux 系統管理與除錯的世界裡,lsof (List Open Files) 無疑是一把瑞士刀般的利器。許多初學者僅知 ls 列出目錄內容,卻不知 Linux 中「一切皆檔案」的核心哲學。當你的伺服器出現磁碟空間無法釋放、網路連線異常或程序無法結束的情況時,lsof 往往是撥雲見日的關鍵。這篇文章將帶你深入 lsof 的進階用法,從基礎概念到實戰除錯,助你成為系統除錯的高手。
為什麼你需要 lsof?
在 Linux 中,不僅是普通的文件,連同目錄、裝置、網路連線(Socket)、管道(Pipe)甚至記憶體映射,都被抽象化為「檔案」。當一個程序(Process)開啟了這些資源,lsof 就能追蹤並列出相關資訊。相較於 ps 僅顯示程序狀態,lsof 能告訴你「這個程序到底打開了什麼」,這在處理資源衝突時至關重要。
核心選項與實際應用
安裝 lsof 在 Ubuntu 或 Debian 上非常簡單:
sudo apt update
sudo apt install lsof
以下我們將透過幾個常見場景,演示如何精準定位問題。
1. 找出佔用特定目錄的程序
假設你嘗試卸載一個 USB 裝置或刪除一個目錄,卻收到 Device or resource busy 錯誤。這通常意味著有程序正鎖定該路徑。
使用 -D 選項可以指定目錄,但更推薦使用 -p 結合 find 或直接使用 -d 來查看目錄下的開啟檔案。不過,最直觀的方式是查看誰在該目錄下開啟了檔案:
# 查看誰在 /var/log 目錄下開啟了檔案
sudo lsof +D /var/log
輸出結果會包含 COMMAND(程序名)、PID(程序 ID)、USER(使用者)、FD(檔案描述符)、TYPE(檔案類型)與 NAME(檔案路徑)。若發現某個非預期的程序佔用了關鍵目錄,你可以根據 PID 進一步檢查該程序的狀態。
2. 鎖定特定網路連接 (Port)
網路除錯是 lsof 的另一個強項。當某個 Port 被佔用,導致服務無法啟動時,你可以這樣做:
# 找出佔用 TCP 8080 Port 的程序
sudo lsof -i :8080
輸出範例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 12345 www 6u IPv4 67890 0t0 TCP *:8080 (LISTEN)
這裡可以看到 nginx 程序(PID 12345)正在監聽 8080 端口。如果你想強制關閉它,可以使用 kill -9 12345(請謹慎操作)。此外,-i 選項支援更複雜的過濾,例如只列出 IPv4 的連線:sudo lsof -i 4。
3. 找出被刪除但尚未釋放空間的檔案
這是系統磁碟空間「失踪」的最常見原因。當一個程序打開了檔案後,你從檔案系統中刪除該檔案,但程序仍持有檔案描述符,導致空間無法釋放。
# 找出狀態為 (deleted) 的檔案
sudo lsof | grep deleted
輸出範例:
python3 54321 user 3uW REG 8,1 1048576 123456 /tmp/data.txt (deleted)
在 NAME 欄位中出現 (deleted) 即代表該檔案已被刪除但仍未釋放。解決方法通常是重啟該程序(如 systemctl restart your-service),讓其關閉檔案描述符並釋放空間。
常見問題與注意事項
Q1: 為什麼我執行 lsof 時出現 "Permission denied"?
lsof 需要讀取 /proc 檔案系統中的資訊,這通常需要 root 權限。如果你不是以 root 身分執行,可能會無法看到其他使用者的程序資訊,甚至完全無法執行。
解決方案: 請務必加上 sudo 執行:
sudo lsof
若你只是想查看自己的程序,可以不加 sudo,但資訊會受限於當前使用者的權限。
Q2: 輸出結果太多,該如何過濾?
lsof 預設會列出所有開啟的檔案,輸出量極大。建議善用管道 (|) 與 grep 進行過濾,或直接使用 lsof 內建的過濾選項。
解決方案: 使用 grep 過濾特定程序或檔案類型:
# 僅顯示 nginx 相關的開啟檔案
sudo lsof -c nginx
# 或結合 grep 過濾關鍵字
sudo lsof | grep "nginx"
此外,使用 -c 選項可以僅列出指定命令名稱的程序,避免輸出過多無關資訊。
小結
lsof 是 Linux 系統管理員的必備工具,特別是在除錯資源衝突、網路連線與磁碟空間問題時。透過掌握 -i(網路)、-c(命令)、+D(目錄)等選項,你能快速定位問題根源。記住,在使用 kill 或其他強制終止手段前,務必確認程序的重要性,以免影響服務穩定性。勤加練習 lsof,你將能更自信地面對複雜的 Linux 系統問題。