lsof 详细使用教程:从 0 到排查端口/进程/文件占用(新手友好)
lsof 详细使用教程:从 0 到排查端口/进程/文件占用(新手友好)
lsof 是 Linux 下非常经典、非常实用的排查工具。它的名字来自:
lsof = LiSt Open Files(列出打开的文件)
它的厉害之处在于:
在 Linux 里,“文件”不只是你理解的文本文件,还包括:
- 普通文件(log、配置、数据文件)
- 目录
- 设备文件
- 管道
- 网络 socket(端口、连接)
因此 lsof 能做两件工程师经常需要的事:
- 从端口找到进程(谁占用了端口?)
- 从进程找到资源(这个进程打开了哪些文件/端口/连接?)
1. 为什么 lsof 很重要?
在实际排查中,常见问题包括:
- 服务启动失败:提示端口被占用
- Jenkins、Docker 容器映射失败:端口冲突
- adb server 5037 异常:多个 adb-server 或端口被占
- logrotate 失败:日志文件被某进程一直占用
- 文件删不掉:系统提示 “Device or resource busy”
- 网络连接异常:某进程疯狂建立连接导致资源耗尽
这些问题用 lsof 通常能快速定位。
2. lsof 基本语法与核心思想
最基础用法:
lsof [选项] [过滤条件]
你可以把它理解成:
lsof = 查看某些进程打开了哪些资源(文件、端口、连接)
3. lsof 输出字段详解(必须看懂)
常见输出格式:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3 1234 calvin 3u IPv4 12345 0t0 TCP *:8080 (LISTEN)
字段解释:
-
COMMAND:进程名(程序名)
-
PID:进程号(非常关键)
-
USER:运行该进程的用户
-
FD:文件描述符(进程打开资源的“句柄编号”)
-
TYPE:资源类型(REG 普通文件、IPv4/IPv6 网络、unix 等)
-
NAME:最关键的信息
- 如果是文件:显示文件路径
- 如果是网络:显示
IP:PORT和状态(LISTEN/ESTABLISHED 等)
FD 字段里的常见符号
例如 3u:
3:文件描述符编号u:读写(read/write)
常见后缀:
r:只读w:只写u:读写
4. 新手最常用:查端口被谁占用
4.1 查 8080 端口被哪个进程占用
sudo lsof -i :8080 -P -n
你应该关注:
- COMMAND
- PID
- NAME(端口、状态)
参数解释
-i :8080:筛选网络连接,端口为 8080-P:端口显示数字(不解析成 http/https)-n:IP 不解析域名(快)sudo:避免权限不足看不到 PID/进程名
4.2 查 adb 端口 5037
sudo lsof -i :5037 -P -n
5. 列出系统所有监听端口(LISTEN)
这是排查“服务到底起没起”的神器。
sudo lsof -iTCP -sTCP:LISTEN -P -n
5.1 这条命令是什么意思?
-iTCP:只看 TCP 协议的网络 socket
(等价于-i TCP,只是写在一起了)-sTCP:LISTEN:只看 TCP 状态为 LISTEN 的 socket-P -n:端口和 IP 用数字显示
最终效果:
列出所有正在监听 TCP 端口的进程(谁在开门)
6. 查看已建立连接(ESTABLISHED)
你想看哪些连接已经建立(例如:谁在连数据库、谁在连外部 API):
sudo lsof -iTCP -sTCP:ESTABLISHED -P -n
7. 从进程出发:查某个 PID 打开了哪些网络连接
你已经知道 PID=1234,想看它占用了哪些端口、连了哪些地址:
sudo lsof -p 1234 -i -P -n
参数解释
-p 1234:只看这个进程-i:只显示网络相关资源(socket)-P -n:数字显示
这条命令常用于:
- 排查某进程到底监听了哪些端口
- 排查某进程是否连了某个外部地址(如数据库、MQ)
8. 从进程出发:查某个 PID 打开了哪些文件
查看 PID=1234 打开的所有资源(包括文件、socket、设备等):
sudo lsof -p 1234
你会看到:
- 配置文件
- 日志文件
- 动态库
- socket
- 临时文件
9. 从文件出发:查某个文件被谁占用(非常实用)
9.1 查某个日志文件被哪个进程打开
sudo lsof /var/log/syslog
常见用途:
- logrotate 轮转失败
- 删除文件失败(文件仍被占用)
- 修改文件不生效(进程仍使用旧文件句柄)
9.2 查目录下被占用的文件(可能输出很多)
sudo lsof +D /path/to/dir
注意:
+D 会递归扫描目录,可能很慢,谨慎使用。
10. 只看某个进程名(按 COMMAND 过滤)
10.1 按进程名前缀过滤
sudo lsof -c python
注意:
-c 是前缀匹配,不是完全匹配。
例如:
- python
- python3
- python3.10
都可能被匹配到。
11. lsof 的网络过滤语法(理解 -i)
-i 的意义是:只看网络 socket,并且可以带过滤条件。
常见写法:
11.1 查看所有网络 socket
sudo lsof -i
效果:
输出系统里所有进程的网络连接(TCP/UDP,监听/已连接)
通常会很多,所以一般要加筛选条件。
11.2 只看 TCP
sudo lsof -iTCP
11.3 只看 UDP
sudo lsof -iUDP
11.4 只看某个端口(TCP/UDP 都可能)
sudo lsof -i :8080 -P -n
11.5 只看 TCP 的某个端口
sudo lsof -iTCP:8080 -P -n
11.6 只看某个远程主机
sudo lsof -i @1.2.3.4 -P -n
11.7 只看某个远程主机的某个端口
sudo lsof -i @1.2.3.4:443 -P -n
12. TCP 状态过滤(理解 -s)
-s 是按 socket 状态过滤(主要用于 TCP)。
12.1 只看监听状态
sudo lsof -iTCP -sTCP:LISTEN -P -n
12.2 只看已建立连接
sudo lsof -iTCP -sTCP:ESTABLISHED -P -n
13. 为什么总是建议加 -P -n?
13.1 -P 的作用
不加 -P,端口可能会被翻译成服务名:
- 80 → http
- 443 → https
- 22 → ssh
排查时通常希望看到数字端口,所以加 -P。
13.2 -n 的作用
不加 -n,IP 可能被解析成域名:
- 输出不直观
- 解析 DNS 可能导致命令变慢
排查时追求快、准,所以加 -n。
14. 典型排查实战(推荐记住)
场景 1:服务启动失败,提示端口被占用
sudo lsof -i :8080 -P -n
拿到 PID 后:
ps -fp PID
确认进程是谁,再决定是否关闭:
kill PID
场景 2:系统到底有哪些服务在监听?
sudo lsof -iTCP -sTCP:LISTEN -P -n
场景 3:某个进程疯狂连外网/数据库
sudo lsof -p 1234 -i -P -n
场景 4:文件删不掉/日志轮转失败
sudo lsof /path/to/file
15. lsof 与 ss / netstat / ps 的区别(怎么选)
ps:看进程(进程是否存在、启动命令)ss:看网络连接(现代 Linux 首选)netstat:老工具(兼容老习惯)lsof:从资源角度把进程和端口/文件关联起来(定位非常强)
在工程排查里最常见的组合是:
lsof查端口是谁 →ps看它是谁 →kill或改配置
16. 新手建议背下来的“最小必会集合”
你只要记住下面 3 条,就能覆盖 80% 的工作排查场景:
① 查端口占用
sudo lsof -i :PORT -P -n
② 查所有监听端口
sudo lsof -iTCP -sTCP:LISTEN -P -n
③ 查某个 PID 的网络连接
sudo lsof -p PID -i -P -n
17. 常见坑与注意事项
17.1 权限不足看不到进程信息
解决:加 sudo
sudo lsof -i :8080 -P -n
17.2 输出太多看不懂
解决:加过滤条件:
-i :端口-iTCP-sTCP:LISTEN-p PID-c 进程名前缀
17.3 -i 后面不能写 PID
-i 只管网络过滤;PID 用 -p。
18. 总结
lsof 是 Linux 排查问题的“万能显微镜”。
- 端口问题:用
lsof -i :PORT - 监听情况:用
lsof -iTCP -sTCP:LISTEN - 进程占用:用
lsof -p PID - 文件占用:用
lsof /path/to/file
当你熟练掌握 lsof,你会发现很多看似复杂的系统问题,本质上只是:
某个进程打开了某个资源而你不知道是谁。
lsof 的价值就在于:它能把“谁”和“什么资源”一秒对应起来。

浙公网安备 33010602011771号