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 選項。