端口占用查看

#linux #运维 #工具

总结
  • 查端口占用三板斧:lsof -i:端口netstat -ntlp | grep 端口ss -tlnp | grep 端口
  • ssnetstat 的现代替代品,速度更快,新系统优先用 ss
  • 找到 PID 后用 kill -9 PID 强制终止,或 kill -15 PID 优雅终止
  • 防火墙端口操作用 firewall-cmd,开放端口后记得 --reload 生效

1. 查看端口占用

lsof(最直接)

# 查看指定端口被哪个进程占用
lsof -i:8080

# 同时查看多个端口
lsof -i:8080 -i:9090

# 只看 TCP
lsof -i tcp:8080

# 只看 UDP
lsof -i udp:8080

输出示例:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java     1234 root   87u  IPv6  12345      0t0  TCP *:8080 (LISTEN)

netstat

# 查看所有 TCP 监听端口
netstat -ntlp

# 查看指定端口
netstat -ntulp | grep 8080

# 查看所有连接(含 UDP)
netstat -ntulp

参数说明:

参数 含义
-t 只显示 TCP 连接
-u 只显示 UDP 连接
-n 禁用域名解析,加快查询
-l 只显示正在监听的端口
-p 显示进程 PID 和名称

ss(推荐,netstat 的现代替代)

ssnetstat 速度更快,新系统优先用这个:

# 查看所有 TCP 监听端口
ss -tlnp

# 查看指定端口
ss -tlnp | grep 8080

# 查看所有连接状态
ss -s

2. 终止占用端口的进程

# 找到 PID
lsof -i:8080

# 优雅终止(给进程处理退出的机会)
kill -15 <PID>

# 强制终止(进程不响应时用)
kill -9 <PID>

# 一步到位:找到并杀掉占用 8080 的进程
kill -9 $(lsof -t -i:8080)

# 按进程名终止
pkill -f java
killall java

3. 防火墙端口管理(firewalld)

# 查询端口是否开放
firewall-cmd --zone=public --query-port=8080/tcp

# 开放端口(临时,重启失效)
firewall-cmd --zone=public --add-port=8080/tcp

# 开放端口(永久)
firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 关闭端口
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

# 重新加载配置(--permanent 操作后必须执行)
firewall-cmd --reload

# 查看所有已开放的端口
firewall-cmd --zone=public --list-ports

# 查看防火墙状态
firewall-cmd --state

4. 常用场景

服务启动失败提示端口被占用

# 1. 找到占用进程
lsof -i:8080
# 或
ss -tlnp | grep 8080

# 2. 确认是否可以终止
ps -p <PID> -o pid,user,cmd

# 3. 终止进程
kill -9 <PID>

查看某个进程监听了哪些端口

# 通过进程名查
ss -tlnp | grep java

# 通过 PID 查
lsof -p <PID> -i

查看端口连接数(排查连接堆积)

# 统计各状态的 TCP 连接数
ss -s

# 查看 8080 端口的所有连接及状态
ss -tnp | grep 8080

# 统计 ESTABLISHED 连接数
ss -tn | grep ESTABLISHED | wc -l