Linux查看端口被哪个进程占用,lsof命令
时间:2026-10-6 08:02 作者:emer 分类: 无
前言
启动服务的时候提示 "Address already in use",端口被占了,但不知道被哪个进程占了?这时候就需要用 lsof 或者 netstat 命令来查一下。本文讲一下怎么用。
lsof 命令
安装
CentOS 最小化安装可能没有 lsof:
yum install -y lsof
查看某个端口被哪个进程占用
lsof -i:端口号
比如看 80 端口被谁占了:
lsof -i:80
输出类似:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
重点看:
PID:进程号COMMAND:进程名
知道了 PID 之后,想杀掉就用 kill PID。
查看所有正在监听的端口
lsof -i -P -n | grep LISTEN
输出所有处于监听状态的端口和对应的进程。
netstat 命令
安装
来自 net-tools 包:
yum install -y net-tools
查看端口被哪个进程占用
netstat -tlnp | grep 端口号
比如看 80 端口:
netstat -tlnp | grep :80
输出类似:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
最后一列就是 PID/进程名。
参数解释
| 参数 | 含义 |
|---|---|
-t |
显示 TCP 连接 |
-l |
只显示监听状态的 |
-n |
显示数字,不解析域名 |
-p |
显示进程名和 PID |
查看所有监听端口
netstat -tlnp
fuser 命令
查看端口被哪个进程占用
fuser 端口号/tcp
比如:
fuser 80/tcp
输出:
80/tcp: 1234
直接显示 PID,简单粗暴。
杀掉占用端口的进程
fuser -k 80/tcp
直接把占用 80 端口的进程杀掉。
常见场景
场景1:启动 Nginx 提示端口被占
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
查一下:
lsof -i:80
发现是旧的 nginx 进程没杀掉,直接杀:
kill 1234
或者:
fuser -k 80/tcp
场景2:3306 端口不知道被谁占了
lsof -i:3306
发现是 MySQL 进程,正常的。
场景3:找出所有被占用的端口
netstat -tlnp
列出所有正在监听的端口。
常见坑
坑1:lsof 命令找不到
执行 lsof 提示 command not found。
原因: 没装 lsof 包。
解决:
yum install -y lsof
坑2:普通用户看不到其他用户的进程
用普通用户执行 lsof,看不到 root 的进程。
原因: 权限不够。
解决: 加 sudo 或者切 root:
sudo lsof -i:80
坑3:端口明明没被占但提示被占
服务明明没启动,但启动时提示端口被占。
原因: 可能有 TIME_WAIT 状态的连接还没释放。
解决: 等一会儿再试,或者改端口。
坑4:杀了进程端口还是没释放
杀掉进程了,但端口还是显示被占。
原因: 进程还在退出中,等几秒就好了。
总结
| 命令 | 作用 |
|---|---|
lsof -i:端口号 |
查看端口被哪个进程占用 |
netstat -tlnp \| grep :端口号 |
用 netstat 查端口 |
fuser 端口号/tcp |
查看端口对应的 PID |
fuser -k 端口号/tcp |
杀掉占用端口的进程 |
最常用的就是 lsof -i:端口号,一眼就能看到进程名和 PID。
遇到问题加QQ23979811 协助处理