ss -tuln是最直接有效的命令,可列出所有监听中的tcp/udp端口,state列为listen才表示真正监听,0.0.0.0:80表示监听所有ipv4地址,[::]:80表示监听所有ipv6地址,127.0.0.1:5432表示仅本地可连。

ss -tuln 是最直接有效的命令
绝大多数现代 Linux 发行版默认自带 ss,它绕过用户态解析,直接读取内核 socket 表,响应快、结果准。不需要额外安装,也不依赖 DNS 解析,避免卡顿。
执行 sudo ss -tuln 可列出所有监听中的 TCP/UDP 端口(含其他用户和服务的),关键字段包括:
-
State列为LISTEN才是真正监听状态 -
Local Address:Port中的0.0.0.0:80表示监听所有 IPv4 地址;[::]:80表示监听所有 IPv6;127.0.0.1:5432表示仅本地可连 - 不加
sudo时,只能看到当前用户启动的进程监听端口,系统服务(如systemd-journald、dbus)会缺失
查某个端口是否在监听,别用 netstat -tulpn | grep
netstat -tulpn | grep ':3000' 看似直观,但有三个实际问题:
- 输出中端口可能出现在
Foreign Address字段(比如 ESTABLISHED 连接),导致误判 - 部分精简镜像(如 Alpine、Distroless)根本不带
netstat,需额外装net-tools -
-p参数在非 root 下常报Permission denied,即使你 own 那个进程 —— 内核禁止非 root 查看其他进程 socket 信息
更稳妥的做法是:sudo ss -tuln | grep ':3000$'(结尾加 $ 锚定端口位置),或直接用 lsof -i :3000。
lsof -i :端口号 能精准定位进程
当你要知道「哪个进程占着 8080」,lsof 是唯一能直接给出 COMMAND/PID/USER 的工具。但它不是系统默认安装项,CentOS/RHEL 需 yum install lsof,Debian/Ubuntu 需 apt install lsof。
常用组合:
-
sudo lsof -i :8080—— 直接查端口,输出含 PID、COMMAND、USER -
sudo lsof -i -P -n -s TCP:LISTEN—— 列出全部 TCP LISTEN 套接字,跳过 DNS 和服务名解析,提速 - 无输出 ≠ 端口空闲:可能是没权限(未加
sudo),也可能是该端口根本没被监听
注意不同命令对“监听”的定义差异
有些命令显示的是“socket 存在”,但未必真在监听。比如 netstat -an 会把 TIME_WAIT、ESTABLISHED 全列出来,干扰判断;ss -tun(没加 -l)也会混入已建立连接。
真正代表“正在等待新连接”的,只有明确标为 LISTEN 的条目。所以:
-
ss -tuln中State列必须是LISTEN -
netstat -tuln中State列必须是LISTEN -
lsof -i输出中TCP行的(LISTEN)标记不可省略
忽略这个状态标识,就容易把临时连接当成服务入口,排查方向会彻底跑偏。











