Linux 查看端口占用与进程排查教程:lsof、netstat、ss 三件套,找出谁在占端口


"端口被占用了!""这个端口是谁在监听?""想杀一个进程却找不到 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 防火墙教程一起用更顺手。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

MySQL 忘记 root 密码怎么办:免密进入、重置密码全流程,秒级找回

Nginx location 匹配规则详解:=、^~、~、/ 的区别与优先级,配置不再踩坑

评 论
更换验证码