首选lsof -iTCP -sTCP:LISTEN -P -n,因其直接读取内核/proc、不依赖socket统计,能精准过滤仅LISTEN态TCP端口,且避免DNS解析卡顿、服务名混淆及IPv6干扰;netstat在新系统常未预装、输出易误判、非root下PID不可见。

直接用 lsof -iTCP -sTCP:LISTEN -P -n 就能列出所有进程监听的 TCP 端口,不解析主机名和服务名,输出干净、速度快、字段明确。
为什么不用 netstat -tulnp 查每个进程的端口
它确实能显示 PID 和程序名,但有三个现实问题:
- 在较新发行版(如 Ubuntu 22.04+、CentOS 8+)中默认不预装,需额外
apt install net-tools或yum install net-tools - 输出里混着 IPv6 地址(如
:::8080),grep 过滤时容易漏掉或误匹配 - 对非 root 用户,
-p参数常报 “can’t identify protocol” 或只显示“-”,PID 列为空
lsof -iTCP -sTCP:LISTEN 的关键参数含义
这个组合不是随便拼的,每个参数都解决一个实际痛点:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
-iTCP:只查 TCP 协议,排除 UDP 干扰(比如 DNS、NTP 的udp行) -
-sTCP:LISTEN:只显示处于 LISTEN 状态的套接字,过滤掉 ESTABLISHED、TIME_WAIT 等无关连接 -
-P:强制显示端口号(如:3306),而不是服务名(:mysql),避免因/etc/services缺失或配置异常导致输出错乱 -
-n:跳过 DNS 反向解析,防止查询卡顿(尤其在无网络或 hosts 配置异常时)
想按进程分组看它占了哪些端口,用 lsof -i -P -n | awk '{print $1,$2,$9}' | sort
这条命令适合排查“某个服务悄悄开了多个端口”的场景,比如 Node.js 启动时同时监听 3000(HTTP)、3001(metrics)、3002(debug):
-
$1是 COMMAND(进程名),$2是 PID,$9是 NETWORK FILE 字段(含 IP:PORT) - 输出类似:
nodejs 26993 *:3000、nodejs 26993 *:3001,一眼看出同一 PID 开了多个端口 - 注意:不加
sudo时看不到其他用户的进程;加sudo后才能看到全部,但部分容器内进程可能仍不可见(取决于命名空间隔离强度)
如果 lsof 没装,优先装它而不是 net-tools
现代系统里 lsof 比 netstat 更可靠:
-
lsof直接读取内核/proc数据,不依赖 socket 统计接口,兼容性更强 - Ubuntu/Debian 下执行
sudo apt install lsof,CentOS/RHEL 下执行sudo yum install lsof(RHEL 8+ 用dnf) - 装完立刻生效,无需重启任何服务;而
netstat在某些精简镜像(如 Alpine)中压根没对应包
真正容易被忽略的是:LISTEN 状态不等于“正在提供服务”。有些进程会绑定端口后长期空闲(比如 Spring Boot 的 Actuator 端点),或者监听 127.0.0.1 而非 0.0.0.0,外部根本连不上——得结合 Local Address 列的 IP 段一起判断。

















