Linux查看端口占用
Linux查看端口占用
引言
启动服务时报Address already in use,说明目标端口被别的进程占着。上线前要确认端口是否监听、被哪个PID占用,常用ss、netstat、lsof三个工具,先定位进程再决定停掉还是换端口。
ss查看(推荐)
ss替代netstat,更快更全:
ss -tlnp | grep 80
- -t TCP,-l 监听状态,-n 数字端口不解析,-p 显示进程PID和名称。
看TCP监听端口最直接。
netstat兼容命令
老系统没有ss时:
netstat -tlnp | grep 80
参数含义和ss一致,输出本地地址:端口、PID/程序名。
lsof按端口查进程
lsof -i:80
直接列出占用80端口的进程命令、PID、用户,适合只盯单个端口。
找到并处理
确认是无用进程后:
kill -9 PID
若是被系统服务占用,优先systemctl stop对应服务,别盲目kill。
查看所有监听端口
ss -tlnp
不加grep,列出全部TCP监听,盘点机器开了哪些服务。
注意事项
- 查端口要root或sudo,普通用户看不到别的进程PID;
- 状态LISTEN才是监听,ESTABLISHED是已建立连接,别混淆;
- 端口被占先判断是不是正常服务,误杀线上进程影响业务;
- 云服务器端口不通还要查安全组和防火墙,不只是本机占用;
- ss在新发行版预装,netstat需装net-tools。
总结
日常用ss -tlnp grep端口最省事,netstat兼容老系统,lsof -i:端口看单个占用。定位PID后先确认进程归属再kill,端口连不上时本机占用、防火墙、云安全组三层都要排查。
Linux查看端口被占用,lsof和netstat命令
前言
启动服务的时候报"Address already in use"?想知道某个端口被哪个进程占了?Linux查看端口占用最常用的就是lsof和netstat命令,本文讲清楚。
一、为什么要查端口
- 启动服务报端口被占
- 看某个服务有没有启动
- 排查安全问题,看有没有可疑端口
二、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)
看什么:
- COMMAND:进程名(nginx)
- PID:进程ID(1234)
- USER:运行用户(root)
查看所有TCP端口
lsof -i tcp
查看所有UDP端口
lsof -i udp
杀掉占用端口的进程
kill -9 $(lsof -ti:80)
三、netstat命令
查看某个端口
netstat -tlnp | grep 端口号
例子: 查80端口
netstat -tlnp | grep :80
输出:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
看什么:
- 最后一列:进程ID/进程名(1234/nginx)
参数解释
| 参数 | 含义 |
|---|---|
| -t | TCP端口 |
| -l | 只看监听中的 |
| -n | 显示数字,不解析域名 |
| -p | 显示进程名和PID |
查看所有监听端口
netstat -tlnp
四、ss命令(推荐)
ss是netstat的升级版,更快。
查看某个端口
ss -tlnp | grep 端口号
例子:
ss -tlnp | grep :80
查看所有监听端口
ss -tlnp
五、三种命令对比
| 命令 | 优点 | 缺点 |
|---|---|---|
| lsof | 信息全,能看文件 | 慢 |
| netstat | 经典,大家都用 | 慢 |
| ss | 最快,推荐 | 新命令 |
推荐: 用ss,最快。
六、常见场景
场景1:启动Nginx报端口被占
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
排查:
lsof -i:80
解决: 杀掉占用的进程
kill -9 进程ID
场景2:看MySQL有没有启动
ss -tlnp | grep 3306
有输出就是启动了。
场景3:看SSH端口
ss -tlnp | grep sshd
七、常见坑
坑1:没加sudo看不到进程
普通用户只能看自己的进程,看不到别人的。
解决: 加sudo
sudo lsof -i:80
sudo netstat -tlnp
坑2:netstat命令找不到
CentOS7最小化安装没有netstat。
安装:
yum install -y net-tools
坑3:lsof命令找不到
安装:
yum install -y lsof
八、常用命令汇总
# 查80端口被谁占了
lsof -i:80
netstat -tlnp | grep :80
ss -tlnp | grep :80
# 看所有监听端口
netstat -tlnp
ss -tlnp
# 杀掉占用80端口的进程
kill -9 $(lsof -ti:80)
总结
记住:
- 查端口用
lsof -i:端口号 - 或者用
ss -tlnp | grep 端口号 - 看最后一列就是进程名和PID
- 杀掉用
kill -9 进程ID - 推荐用ss,最快
最常用:
ss -tlnp | grep :80
遇到问题加QQ23979811 协助处理
Linux查看端口被哪个进程占用,lsof命令
前言
启动服务的时候提示 "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 协助处理
Linux查看进程启动时间,ps和lsof命令使用
前言
想知道某个进程跑了多久?或者想知道哪个进程打开了某个文件?这时候就需要用到 ps 和 lsof 两个命令了。ps 用来查看进程信息,包括启动时间、运行状态等;lsof 用来查看进程打开了哪些文件。这两个命令是运维排查问题的必备工具。本文就详细讲一下这两个命令的使用。
ps 命令
基本用法
ps aux
输出所有进程的详细信息。
输出示例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 128000 5000 ? Ss Oct01 0:05 /usr/lib/systemd/systemd
root 123 0.0 0.2 150000 10000 ? Ss Oct01 0:10 /usr/sbin/sshd
nginx 4567 0.0 0.3 200000 15000 ? S Oct05 0:02 nginx: worker process
各列含义
| 列 | 含义 |
|---|---|
USER |
进程所属用户 |
PID |
进程ID |
%CPU |
CPU占用百分比 |
%MEM |
内存占用百分比 |
VSZ |
虚拟内存大小 |
RSS |
物理内存大小 |
TTY |
终端 |
STAT |
进程状态 |
START |
启动时间 |
TIME |
累计CPU时间 |
COMMAND |
启动命令 |
查看进程启动时间
ps -p PID -o lstart
比如查看PID为123的进程的启动时间:
ps -p 123 -o lstart
输出:
STARTED
Mon Oct 1 10:30:45 2026
查看某个进程的详细信息
ps aux | grep nginx
按CPU占用排序
ps aux --sort=-%cpu | head -10
按内存占用排序
ps aux --sort=-%mem | head -10
lsof 命令
lsof = list open files,用来查看进程打开了哪些文件。
基本用法
lsof
列出所有进程打开的所有文件。
查看某个进程打开的文件
lsof -p PID
比如查看PID为123的进程打开了哪些文件:
lsof -p 123
查看某个文件被哪个进程占用
lsof 文件路径
比如查看 /var/log/nginx/access.log 被哪个进程占用:
lsof /var/log/nginx/access.log
查看某个端口被哪个进程占用
lsof -i :80
查看80端口被哪个进程占用。
查看某个用户打开的文件
lsof -u nginx
查看nginx用户打开的所有文件。
查看某个目录下被打开的文件
lsof +D /var/log/
查看 /var/log/ 目录下所有被打开的文件。
实际排查案例
案例1:磁盘空间没释放
删了一个大文件,但磁盘空间没释放。这是因为还有进程在写这个文件。
lsof | grep deleted
输出所有已删除但还被进程占用的文件。找到对应的PID,重启那个进程就能释放空间了。
案例2:端口被占用
启动Nginx的时候报错"Address already in use",说明80端口被占用了。
lsof -i :80
看是哪个进程占了80端口,杀掉或者换个端口。
案例3:进程启动时间不对
怀疑某个服务被重启过,看看启动时间。
ps -ef | grep nginx
或者更详细的:
ps -p PID -o lstart
案例4:找出谁在写日志
想知道哪个进程在写某个日志文件。
lsof /var/log/messages
常见坑
坑1:删了文件磁盘空间没释放
这是最常见的坑。删了大文件,但磁盘空间没释放,因为还有进程在写这个文件。
解决: 用 lsof | grep deleted 找到还在写这个文件的进程,重启那个进程,或者直接清空文件内容:
> /var/log/nginx/access.log
坑2:ps aux 和 ps -ef 搞混了
ps aux 和 ps -ef 输出格式不一样,但信息基本一样。aux 是BSD格式,-ef 是System V格式。看个人习惯。
坑3:lsof 输出太多
lsof 不加参数会输出一大堆,根本看不过来。一定要加参数过滤:-p、-i、-u、+D 等。
总结
查看进程信息的核心命令:
- ps aux:看所有进程的基本信息
- ps -p PID -o lstart:看某个进程的启动时间
- lsof -p PID:看某个进程打开了哪些文件
- lsof -i :端口:看某个端口被哪个进程占用
- lsof | grep deleted:看哪些已删除文件还被进程占用
ps 和 lsof 是运维排查问题的基本功,遇到问题先跑一遍这两个命令,大部分问题都能定位到方向。
遇到问题加QQ23979811 协助处理