lsof — 列出開啟中的檔案

列出所有程序開啟中的檔案、網路連線與 socket。

語法

lsof [選項] [檔案]

常用選項

選項 說明 範例
-p PID 只顯示指定 PID 的開啟檔案 lsof -p 1234
-u 使用者 只顯示指定使用者的開啟檔案 lsof -u www-data
-c 程序名 只顯示指定名稱程序的開啟檔案 lsof -c nginx
-i[:port] 顯示網路連線(可指定 port) lsof -i :80
-i 4/6 只顯示 IPv4 或 IPv6 連線 lsof -i4
+D 目錄 遞迴列出目錄下被開啟的所有檔案 lsof +D /var/log/
-n 不解析主機名稱 lsof -n -i :80
-P 不解析 port 名稱(顯示數字) lsof -nP -i :80
-t 只輸出 PID(適合腳本) kill -9 $(lsof -t -i :8080)

使用範例

範例 1:查看哪個程序在使用特定 port

找出占用 80 port 的程序(效果與 ss -tlnp 類似,但更詳細)。

$ sudo lsof -i :80
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234 www-data   6u  IPv4  12345      0t0  TCP *:80 (LISTEN)
範例 2:查看程序開啟的所有檔案

查看 nginx 程序開啟的所有檔案(設定、日誌、socket 等)。

$ sudo lsof -c nginx
COMMAND  PID     USER   FD   TYPE DEVICE  NAME
nginx   1234 www-data  cwd    DIR    8,1  /
nginx   1234 www-data    3r   REG    8,1  /etc/nginx/nginx.conf
nginx   1234 www-data    4w   REG    8,1  /var/log/nginx/access.log
範例 3:強制終止佔用 port 的程序

使用 -t 只輸出 PID,配合 kill 一次終止所有占用 8080 port 的程序。

$ sudo kill -9 $(lsof -t -i :8080)
範例 4:找出哪些程序開啟了特定檔案

當無法卸載磁碟時,用 lsof 找出誰還在使用其中的檔案。

$ lsof /var/log/nginx/access.log
COMMAND  PID     USER   FD   TYPE DEVICE NAME
nginx   1234 www-data   4w   REG    8,1  /var/log/nginx/access.log

常見錯誤與排錯

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system
原因
嘗試查詢某些虛擬或 FUSE 檔案系統時出現警告,通常無害。
解法
加上 2>/dev/null 忽略這些警告,或加 -s 選項。

延伸閱讀