"端口被占用了!""这个端口是谁在监听?""想杀一个进程却找不到 PID"——服务器上这类问题天天发生。端口被占用导致服务起不来、8080 被流氓进程占了、WebSocket 连不上……要排查,就得会用 lsof、netstat、ss 这三个命令。这篇文章把它们最常用的用法讲透,照着敲就能定位。
一、三个命令怎么选
ss:新一代命令,快、信息全,首选netstat:老牌命令,系统一般都带lsof:查"文件/端口被哪个进程占用"最直观
三者的核心用途一样:查端口监听、查连接、找进程。
二、查看端口是否被监听(最常用)
用 ss(推荐):
ss -tlnp
参数拆解:-t TCP、-l 监听、-n 不解析域名(显示数字端口)、-p 显示进程。
输出会告诉你:哪个端口在监听、监听在哪个地址、是哪个进程(PID)。
单独查某个端口:
ss -tlnp | grep 8080
# 或
ss -tlnp '( sport = :8080 )'
用 netstat(老系统):
netstat -tlnp
netstat -tlnp | grep 3306
-p 显示进程需要 root,用 sudo 跑才有 PID。
三、端口被占用了,是谁?
场景:启动服务时报 "Address already in use"
sudo lsof -i :8080
# 或
sudo ss -tlnp | grep 8080
lsof -i :端口 会直接显示占用该端口的进程名和 PID。看到 PID 后,确认没问题再结束它:
sudo kill -9 12345 # 12345 换成 PID
只显示 PID:
lsof -ti :8080
配合 kill 一键结束:
kill -9 $(lsof -ti :8080)
四、看所有建立的连接
排查"谁在连我的服务器""有没有可疑外连":
ss -tn # 所有 TCP 连接
ss -tn state established # 只看已建立的
ss -tan # 连监听带连接一起看
统计各状态:
ss -s
会汇总 ESTAB、TIME-WAIT、LISTEN 等数量,一眼看出连接状态分布,排查 SYN 攻击、TIME_WAIT 过多很管用。
netstat 版本:
netstat -an | grep ESTABLISHED
五、看某个进程用了哪些端口
已知 PID 反查:
sudo ss -tlnp | grep 1234
已知进程名反查:
sudo lsof -i -P | grep nginx
lsof 还能列出进程打开的所有文件/端口(-p 指定 PID,-u 指定用户):
sudo lsof -p 1234
六、实战:一个完整的排查流程
场景:8080 端口起不来
# 1. 看谁占用了 8080
sudo lsof -i :8080
# 2. 确认是哪个程序(拿 PID)
ps -fp 12345
# 3. 确认无误后结束进程
sudo kill 12345
# 杀不掉再强杀
sudo kill -9 12345
# 4. 确认端口已释放
ss -tlnp | grep 8080
# 无输出 = 已释放
场景:怀疑服务器被挖矿/被外连
# 找出所有外连 IP,数一数
ss -tn | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn
异常的高频目标 IP 就要警惕,配合本站挖矿病毒查杀教程处理。
七、常见问题
Q1:提示 Permission denied / 没有进程名?
-p 要看别人的进程需要 root,加 sudo。
Q2:netstat 命令不存在?
老命令在某些精简系统没装。用 ss(util-linux 自带)替代,或者 apt install net-tools 安装。
Q3:查端口但没结果?
确认端口没在监听(用 ss -tan 看所有),或者你查的是 UDP(加 -u)。防火墙拦截的请求不会体现在监听里,那是 iptables/ufw 的事。
Q4:TIME_WAIT 一大堆正常吗?
短连接多的服务正常。过多可以调内核参数优化,参考本站 Nginx 配置教程里对 keepalive 的说明。
Q5:怎么监听所有网卡还是本机?
ss -tlnp 里 0.0.0.0:端口 表示所有网卡,127.0.0.1:端口 只监听本机。想让外部访问就监听 0.0.0.0。
总结
排查端口占用就三步:lsof -i :端口 找进程 → ps 确认 → kill 结束;看监听状态用 ss -tlnp,看连接分布用 ss -s。推荐优先用 ss,配合 lsof 几乎能解决所有"端口被占"的问题。这些命令是服务器日常运维的基本功,配合本站的进程管理、iptables 防火墙教程一起用更顺手。
