lsof 详细使用教程:从 0 到排查端口/进程/文件占用(新手友好)

lsof 详细使用教程:从 0 到排查端口/进程/文件占用(新手友好)

lsof 是 Linux 下非常经典、非常实用的排查工具。它的名字来自:

lsof = LiSt Open Files(列出打开的文件)

它的厉害之处在于:
在 Linux 里,“文件”不只是你理解的文本文件,还包括:

  • 普通文件(log、配置、数据文件)
  • 目录
  • 设备文件
  • 管道
  • 网络 socket(端口、连接)

因此 lsof 能做两件工程师经常需要的事:

  1. 从端口找到进程(谁占用了端口?)
  2. 从进程找到资源(这个进程打开了哪些文件/端口/连接?)

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 的价值就在于:它能把“谁”和“什么资源”一秒对应起来。

posted @ 2026-02-19 16:39  CalvinMax  阅读(2)  评论(0)    收藏  举报