命令详解 lsof
lsof 是 “list open files” 的缩写。Linux 中套接字、设备、目录和普通文件都可表现为文件描述符,因此它常用于定位端口占用、无法卸载的文件系统、被删除但仍占空间的文件,以及进程正在访问的路径。
基础用法
# 查看某个文件被谁打开
sudo lsof -- /var/log/app.log
# 查看目录树中打开的文件(可能较慢)
sudo lsof +D /srv/app
# 查看某个 PID
sudo lsof -p 1234
# 查看某个用户的进程
sudo lsof -u appuser
普通用户通常只能看到自己有权限访问的信息。系统级排障建议使用 sudo,并明确过滤条件,避免在大型服务器上直接扫描全部文件。
端口和网络连接
# 8080 端口,不解析主机名和服务名
sudo lsof -nP -i :8080
# TCP 监听套接字
sudo lsof -nP -iTCP -sTCP:LISTEN
# UDP 53 端口
sudo lsof -nP -iUDP:53
# IPv4 TCP 443
sudo lsof -nP -i4TCP:443
-n 禁止 DNS 反查,-P 禁止把端口转换为服务名,排障时速度更快、结果也更直观。
多个条件如何组合
lsof 中不同选择条件常按“或”匹配;增加 -a 才表示所有条件同时满足。例如只查看 PID 1234 的 TCP 连接:
sudo lsof -nP -a -p 1234 -iTCP
排除用户使用 ^:
sudo lsof -u ^root
不要凭印象组合参数,复杂过滤应先在测试环境确认结果。-F 用于生成便于程序解析的字段输出,不是普通的文件筛选选项。
找回“文件删了但空间没释放”的原因
sudo lsof +L1
输出中链接数小于 1 的打开文件通常已从目录删除,但仍被进程持有。安全处理方式是让对应服务正常重新打开日志或重启服务,而不是随意写入 /proc/<pid>/fd/*。处理后用 df -h 验证空间是否释放。
无法卸载文件系统
sudo lsof /mnt/data
sudo fuser -vm /mnt/data
先判断是进程工作目录、打开文件、容器挂载还是网络文件系统卡顿。不要仅为卸载而强制终止未知业务进程。
读懂关键列
| 列 | 含义 |
|---|---|
COMMAND |
进程命令名,可能被截断 |
PID / USER |
进程号 / 所属用户 |
FD |
文件描述符及访问模式,如 cwd、txt、3r、4w |
TYPE |
REG、DIR、IPv4、IPv6 等 |
DEVICE / NODE |
设备号 / inode 或协议相关标识 |
NAME |
路径、地址或连接信息 |
性能与边界
+D会递归扫描目录,大目录上成本高;先缩小范围。- NFS 或异常网络挂载可能让查询变慢,应结合
findmnt、mount和系统日志。 - 容器内外的 PID、挂载命名空间不同,需要在正确命名空间执行。
- 不同系统和版本支持的选项可能不同,以
lsof -h和本机手册为准。