«

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 之后,想杀掉就用 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 协助处理

标签: Linux netstat lsof 端口占用 进程查询