别再用 netstat 了:用 ss 三步定位 Linux 端口占用
在日常运维里,「端口被谁占用了」大概是被问得最多的问题之一。很多人第一反应是 netstat -tunlp,但较新的发行版里 netstat 所属的 net-tools 已经默认不再安装,取而代之的是 iproute2 套件里的 ss 命令。ss 直接读取内核的 socket 信息,速度更快、信息更全。下面用三步快速定位端口占用。
第一步:查看谁在监听指定端口
假设发现 8080 端口起不来,先执行:
ss -tlnp | grep :8080
参数含义:-t 只看 TCP,-l 只看 LISTEN 状态,-n 不做域名解析(更快),-p 显示占用进程。输出里会直接给出进程名和 PID,例如 users:(("java",pid=2381,fd=87))。
第二步:确认是哪个进程、哪个用户
拿到 PID 后,用 ps 补充上下文:
ps -o pid,ppid,user,cmd -p 2381
这样能看到进程的父进程、运行用户和完整启动命令,判断是不是自己部署的服务,还是系统里的其他守护进程误占了端口。如果是容器环境,还可以用 docker ps --format '{{.ID}} {{.Ports}}' 反向确认容器映射。
第三步:决定放行还是释放
如果确认是自己不需要的旧进程,直接 kill PID 释放;如果是需要的服务,就改配置换端口,或在防火墙/安全组里放行。放行时记得同时检查两层:系统防火墙 firewall-cmd --list-ports 或 ufw status,以及云厂商安全组。经常出现「本机 curl 通、外部不通」就是安全组没放行。
几个实用变体
ss -s:快速看整机 socket 统计,排查连接暴涨。ss -tn state established '( dport = :443 )':只看发往 443 的已建立连接。ss -tlnp 'sport = :80':只过滤源端口 80,无需再管道 grep。
小结:把 ss -tlnp 记成肌肉记忆,比 netstat 更快也更可靠;排查端口问题时,按「看监听 → 认进程 → 定放行」三步走,基本能覆盖绝大多数场景。
- 点赞
- 收藏
- 关注作者
评论(0)