## 场景与两代工具
启动服务报"地址已被使用",或者想确认某端口到底有没有人监听,第一反应就是查端口占用。netstat 是老牌工具,ss 是它的现代替代者,两者能力相当,ss 直接读内核套接字信息,机器上连接数上万时速度快得多,新系统建议默认用 ss。net-tools 软件包在不少发行版已不再预装,脚本里还要兼顾老机器的话,两条路都得会。
## 常用命令对照
查监听端口是最高频的动作:
bash ss -tlnp netstat -tlnp
参数含义一致:t 只看 TCP,l 只看监听状态,n 显示数字端口不做反解析,p 尝试列出占用端口的进程,需要 root 权限才能看到进程名。看已建立的连接把 l 换成 a 加上 t 即可;加 u 可以看 UDP。两工具的输出列大同小异,ss 多了一列 recv-q 与 send-q,监听状态时 recv-q 表示当前等待接受的连接数,配合后面的并发排查很好用。
## 端口冲突的解决步骤
遇到端口被占,固定三步走。第一步 ss -tlnp 找到占用进程的 PID 与程序名,判断它是不是自己人:明明是旧实例没退干净,kill 掉再启动就好。第二步如果不是预期进程,比如 80 被 Apache 家族的 httpd 占着而你装的是 Nginx,先停掉并禁用那个服务,systemctl stop 加 disable。第三步如果查不到进程名,多半是权限不够,sudo 重跑;仍看不到则可能是容器或内核级组件占用,换个端口通常是最快的解法。
## 排查中的提醒
注意监听地址的差别:127.0.0.1:8080 只接受本机访问,外部怎么都连不上,这不是防火墙问题,改配置让它监听 0.0.0.0 或指定公网地址才对外。在顺云的云服务器上排查"服务起了但外网不通"时,先 ss 确认监听地址与端口,再去看防火墙与控制台规则,顺序反了容易白忙。连接数暴涨时用 ss -s 看汇总统计,一眼掌握连接总量与各状态分布。TIME_WAIT 数量大不必恐慌,它是协议的正常收尾状态,只有伴随句柄耗尽才需要动内核参数。统计某端口上的连接数还可以用 ss 加管道配 wc,压测时快速确认并发是否真的打上来了。