lsof 命令速查表 - Linux 进程与端口排查常用命令大全
端口被占、文件被锁、磁盘满却找不到大文件——这三类问题的共同点是需要把「一个资源」反查成「哪个进程」,lsof 就干这件事。表按四个维度铺开:By Process 从 PID 反查打开的文件与连接;By Port 从端口找到占用进程;By File 从文件反查持有者;By Type 处理管道、内存映射这类特殊描述符。最被低估的是排障组里的 +L1——普通 df 看不见已删但仍打开的文件,磁盘不会因 rm 释放,必须靠它定位持有句柄的进程并重启。分工很明确:ss 和 netstat 更快但只管网络,fuser 简洁且 -k 能直接杀进程,/proc 是底层真相但要自己拼。权限是前提:非 root 只能看自己的描述符,半张进程表比没有更误导。
按进程查找 By Process 6
lsof -p 1234查看指定 PID 打开的文件
lsof -c nginx查看 nginx 进程打开的文件
lsof -c /^nginx/正则匹配进程名
lsof -u tom查看指定用户打开的文件
lsof -u ^root排除 root 用户
lsof -p 1234,5678查看多个进程打开的文件
按端口查找 By Port 6
lsof -i :80查看占用 80 端口的进程
lsof -i :8080 -i :8443查看多个端口
lsof -i tcp:80只查看 TCP 80 端口
lsof -i udp:53只查看 UDP 53 端口
lsof -i @192.168.1.1:80查看指定 IP 和端口
lsof -i :1-1024查看所有特权端口(1-1024)占用
按文件查找 By File 4
lsof /var/log/syslog查看谁打开了指定文件
lsof +D /var/log/查看目录下所有打开的文件
lsof +d /var/log/只查看当前目录(不递归)
lsof /dev/sda1查看谁在使用指定设备
网络连接 Network 8
lsof -i查看所有网络连接
lsof -i -n不解析域名(更快)
lsof -i -P不解析端口名(显示数字端口)
lsof -i -n -P组合使用(最快)
lsof -i tcp@192.168.1.1:22查看到指定主机的 SSH 连接
lsof -i -sTCP:ESTABLISHED只查看已建立的连接
lsof -i 4 -P -n只查看 IPv4 连接(不解析加速)
lsof -i 6 -P -n只查看 IPv6 连接
按文件类型 By Type 4
lsof -t只输出 PID(方便管道处理)
lsof -F pfc输出格式化的字段(PID/命令/用户)
lsof -a -p 1234 -c nginxAND 组合条件
lsof -Or -p 1234 -p 5678OR 组合条件
常见排障场景 Troubleshooting 7
lsof -i :80 | grep LISTEN查看 80 端口监听进程
lsof +L1查看已删除但仍被打开的文件(磁盘满时用)
lsof -nP -iTCP -sTCP:LISTEN查看所有监听中的 TCP 端口
lsof -i :22 | grep ESTABLISHED查看已建立的 SSH 连接
lsof -u tom | wc -l统计用户打开的文件数
kill $(lsof -t -i :8080)一键杀掉占用 8080 端口的进程
lsof -i :80 -r 5每 5 秒重复监控 80 端口
命令示例
磁盘满了但 du 看不出原因
lsof +L1+L1 列出已删除但仍被进程打开的文件。文件被 rm 了但空间没释放,就是因为还有进程持有它。重启对应进程或重启机器才回收。
输出
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1420 www 12w REG 254,1 4823445760 1234 /var/log/nginx/access.log (deleted)
查看指定目录下所有被打开的文件
lsof +D /var/log/+D 递归整个目录,较慢但完整;只想看当前层用 +d。删除或移动文件报 "device or resource busy" 时,这条能直接定位占用进程。
查看所有监听中的 TCP 端口(最快)
lsof -nP -iTCP -sTCP:LISTEN-n 不解析域名、-P 显示数字端口,配合状态过滤是 lsof 最快的形式。ls 目录量大时输出会很宽,加 | awk 精简列。
输出
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1420 www 6u IPv4 265781 0t0 TCP *:80 (LISTEN) node 3120 tom 18u IPv4 265781 0t0 TCP *:3000 (LISTEN)
常见坑与注意事项
- lsof 输出量极大,直接跑会刷屏;按 -i、-p、-u 或 +D 限定范围,或接管道过滤。
- 查看其他用户的进程需要 root,普通用户只能看到自己的。
- 删除文件报 device or resource busy 时不要强删,先用 lsof 找出占用进程;强删后空间不会释放。
- lsof +D 递归整个目录在文件极多时非常慢,大目录优先用 lsof | grep。
- 网络连接排查优先用 ss,它读内核 netlink 比 lsof 快一个数量级。
提示
- lsof 需要 root 权限才能查看所有用户的文件,普通用户只能看自己的。
- 端口占用排查:先用 lsof -i :port 找到 PID,再用 kill 杀进程或改配置。
- 磁盘满但找不到大文件时,用 lsof +L1 找已删除但仍被进程占用的文件。
- lsof -p <PID> -a -d cwd 可以只看目标进程的当前工作目录,判断「它到底在哪运行」比看 cmdline 更准,尤其是同名进程多开时。
- lsof -t -i :<端口> 直接输出 PID,方便和 kill 串起来写进一行:kill $(lsof -t -i :3000)。
- 排查 umount 报 target is busy 时用 lsof +D /挂载点,但要意识到 +D 会全量扫描该目录下的 inode,大目录上很慢,先用 +d 试试。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。