ss -ltnp 最靠谱,可一次性列出所有监听的TCP端口、数字格式显示、含PID与进程名;-l监听、-t TCP、-n不解析服务名、-p需sudo获取进程信息。

直接看监听端口,用 ss -ltnp 最靠谱
它能一次性列出所有正在监听的 TCP 端口、不解析服务名(避免 DNS 延迟)、显示 PID 和进程名——这是运维排查端口冲突或服务未启动时最常敲的一条命令。别用 netstat -tulnp,慢且部分新系统已不预装。
ss -ltnp 每个字母代表什么
拆开看更清楚为什么这么组合:
-
-l:只关心“监听中”的套接字,过滤掉已建立的连接 -
-t:限定为 TCP 协议,UDP 监听得加-u -
-n:强制数字格式,跳过/etc/services查服务名,避免卡顿或误判(比如端口 80 显示成http反而干扰定位) -
-p:需要 root 权限,否则报Permission denied;它读取/proc/*/fd/获取进程绑定信息,最后一列是user:process_name(pid)
注意:-p 必须配合 sudo,普通用户执行会漏掉大部分结果。
常见错误和绕过方法
执行 sudo ss -ltnp 后仍看不到某些端口?可能原因有:
- 进程以非 root 用户启动,但绑定了
127.0.0.1:port,-p能看到;若绑定0.0.0.0:port却没显示,检查是否被 SELinux 或 cgroup 限制了ptrace权限 - 容器内进程(如 Docker)在宿主机上不可见,
ss默认只查本机命名空间,需进容器 ns 或用nsenter - 某些服务(如 systemd-resolved)监听
127.0.0.53:53,但ss -ltnp输出里可能缩略为127.0.0.53:domain——这是因为-n不解析端口名,但内核仍按惯例映射了少数知名端口;加-r可强制反解,但通常没必要
想快速定位某个端口是谁在用
别先全量输出再 grep,效率低还容易漏:
- 查 8080 端口:
sudo ss -tlnp 'sport == :8080'(注意单引号、空格、==) - 查所有监听 3000–3999 范围的端口:
sudo ss -tlnp 'sport >= :3000 and sport - 查监听在 IPv4 的 22 端口:
sudo ss -4tlnp 'sport == :22'
过滤语法基于 tcpdump 风格,支持 and/or/!=,但不支持正则;写错括号或空格会静默失败,返回空结果。
真正难的不是记选项,而是理解 ss 查的是内核 socket 表,不是进程列表——所以它永远比 ps aux | grep 更可信,但也会漏掉没走标准 socket API 的模块(比如某些 eBPF 程序)。


















