优先用 ss -tuln 是因它直接读取内核 socket 表,无需额外包、不依赖 dns 解析、响应快且结果准;普通用户仅查自身进程,查全量必须加 sudo,而 netstat 在新版系统中默认未安装且经用户态解析易卡顿。

ss -tuln 最快最准。普通用户能查自己进程,查全量必须加 sudo;不装额外包、不依赖 DNS 解析、不卡顿——这是当前 Linux 发行版默认推荐的唯一可靠方式。
为什么优先用 ss -tuln 而不是 netstat
新版系统(如 Ubuntu 22.04+、CentOS 8+、Alpine)默认不带 netstat,装 net-tools 反而多一层依赖。更关键的是:ss 直接读取内核 /proc/net/ 下的原始数据,而 netstat 会走用户态解析层,遇到大量连接时明显变慢,甚至卡住。
常见错误现象:执行 netstat -tuln 卡住 5 秒以上,或返回空但实际有服务在监听——大概率是 DNS 解析阻塞或权限不足。
实操建议:
• 查全部监听端口:sudo ss -tuln
• 只看 TCP:sudo ss -tln
• 检查 3000 端口是否被监听:sudo ss -tuln | grep ':3000'
• 注意输出中 State 列必须为 LISTEN 才算真正监听,别把 ESTAB 或 TIME-WAIT 当成监听状态
lsof -i :PORT 适合精准定位进程,但别乱加参数
当你已经知道端口号(比如 8080),想立刻知道哪个进程在用它,lsof 是最直白的选择。但它不是“查监听端口”的通用入口——它查的是“打开的网络文件”,语义不同。
容易踩的坑:
• 不加 sudo 时,只能看到当前用户启动的进程,root 或 systemd 启动的服务根本不出现在结果里
• lsof -i :8080 默认会尝试反向解析 IP 和端口名,可能卡顿或返回空(尤其在无 DNS 环境下)
• 正确写法是:sudo lsof -nP -iTCP:8080 -sTCP:LISTEN,其中:
-n 关闭主机名解析
-P 关闭端口名解析(显示 8080 而非 http-alt)
-iTCP:8080 限定协议和端口
-sTCP:LISTEN 过滤出真正监听状态,避免混入已建立连接
脚本里判断端口是否监听,别用 netstat 做条件判断
很多运维脚本用 netstat -tuln | grep -q ':80' 做 if 判断,这在容器或最小化系统里极不可靠——netstat 可能不存在,grep 又可能匹配到其他字段(比如 PID 含 80 的进程)。
安全做法只依赖 ss:
PORT=80<br>if sudo ss -tuln | grep -q ":$PORT\b"; then<br> echo "port $PORT is listening"<br>else<br> echo "port $PORT is not listening"<br>fi
注意
\b 是单词边界,防止 :8080 被误判为 :80;sudo 必须加,否则 root 进程监听的端口永远检测不到。
真实环境里最常漏掉的点:绑定地址。0.0.0.0:80 和 127.0.0.1:80 都算监听,但前者对外可见,后者仅限本地访问——查到端口“在监听”不等于“能从外网访问”,得看 Local Address 列。











