在Linux系统中,查询端口被哪个进程或服务占用,最直接的答案是使用 lsof -i:端口号 或 ss -ltnp 命令,二者都能清晰显示PID和进程名称。 这个问题在运维排障、开发联调时几乎每天都会遇到,尤其是当你启动服务提示“端口已被占用”时,快速定位元凶就成了第一步。
linux查看端口被哪个进程占用:首选lsof命令
lsof 是Linux下专门列出打开文件的工具,而网络连接在Linux里也被视为文件,因此用它查端口非常直观。
基础用法:
lsof -i:8080
输出结果会包含 COMMAND(进程名)、PID(进程号)、USER(运行用户)、FD、TYPE、DEVICE、SIZE/OFF、NODE、NAME(监听地址和端口)。
- 看到
java 1234 root 46u IPv6 12345 TCP :8080 (LISTEN),就说明PID为1234的java进程占用了8080端口。 - 如果只想看监听状态,追加
-sTCP:LISTEN:lsof -i:8080 -sTCP:LISTEN。
配合杀进程:拿到PID后,执行 kill -9 1234 即可强制结束进程,如果权限不够,加上 sudo。
使用ss命令查看端口占用情况
较新版本的Linux发行版普遍使用 ss 替代 netstat,查看监听端口的命令为:
ss -ltnp | grep :8080
参数含义:
-l仅显示监听socket-t仅显示TCP连接-n以数字方式显示端口和IP,避免反向解析-p显示进程信息(需要root权限)
输出中常见 users:(("nginx",pid=2345,fd=6)),直接告诉你进程名和PID,如果没显示PID,请加 sudo,这是排查“linux查端口被哪个服务占用”时最高效的现代方案。
老牌netstat命令依旧可用
虽然部分发行版已不再默认安装 netstat,但很多老系统上它仍是主力,用法类似:
netstat -tlnp | grep :3306
-t TCP协议、-l 监听、-n 数字显示、-p 程序名,同样需要root权限才能看到进程名,如果提示 command not found,在CentOS上可用 yum install net-tools,在Ubuntu上可用 apt install net-tools 安装。
linux netstat和lsof查看端口占用对比
很多新手会纠结该用哪个命令,实际上二者侧重不同,行业共识是:优先用ss,其次lsof,netstat留作兼容老系统,下表可以直观对比:
| 对比项 | netstat | lsof | ss |
|---|---|---|---|
| 安装情况 | 需要net-tools包 | 需要lsof包 | 系统自带(iproute2) |
| 查看端口占用 | netstat -tlnp |
lsof -i:端口 |
ss -ltnp |
| 显示进程名 | 需root | 需root或属主 | 需root |
| 输出速度 | 较慢 | 中等 | 极快 |
| 适用场景 | 老系统兼容 | 精确查单个端口 | 现代Linux默认推荐 |
在脚本排查中,ss 因速度快而更适合批量检查端口;lsof 的优势在于能同时查看socket文件、设备文件等,当你需要确认某个端口是否被UDP或Unix socket占用时,lsof 更灵活,多数情况下,先用 ss -ltnp 扫一眼全貌,再用 lsof -i:端口 精确锁定,是效率最高的组合。
8080端口被占用怎么解决Linux:实战排查步骤
这里用一个常见场景演示完整排查过程,假设你启动Spring Boot应用时得到错误提示:Port 8080 was already in use.
第一步:确认占用者。
sudo lsof -i:8080
如果输出为空,改用UDP检查:sudo lsof -iUDP:8080,或者用 ss -ulnp | grep 8080。
第二步:根据PID定位进程详情。
ps -ef | grep 8080
但这里的8080是端口号,不是进程号,正确做法是使用第一步得到的PID,执行:
ps -p 1234 -f

或者直接看进程启动路径:
readlink -f /proc/1234/cwd
这样能区分是哪个项目目录下的进程,避免误杀。
第三步:按需处理。
- 如果是残留进程,直接结束:
kill -9 1234 - 如果是合法服务占用了端口,要么换端口启动新服务,要么调整旧服务配置,例如Nginx默认占用80端口,你不想停掉它,就把新应用改到8081端口。
第四步:验证结果。
ss -ltnp | grep 8080
无输出即表示端口已释放,此时再启动你的服务即可。
常见问题Q&A
为什么普通用户执行lsof -i:8080看不到进程名?
因为非root用户只能看到自己拥有的进程信息,如果端口被其他用户的进程占用,必须使用 sudo 才能显示完整的PID和COMMAND,这是Linux权限隔离的正常表现,并非命令异常。
无法安装lsof时如何查看端口占用?
使用系统自带的 ss 命令几乎能完全替代。ss -ltnp 就是标准答案。ss 也不存在(内核极老),则尝试 /proc/net/tcp 配合十六进制端口转换,但这种方式过于繁琐,实际运维中更推荐先安装 lsof 或 net-tools,部分容器镜像为精简体积未包含这些工具,执行 apt update && apt install lsof 或 yum install -y lsof 即可。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/757085.html

