Linux查看服务器开放端口,netstat和ss命令教程
前言
排查网站打不开、端口是否被占用、服务有没有监听,都要先看服务器开放了哪些端口。Linux 上最常用的两个工具是 netstat 和 ss,ss 是新系统推荐的替代,速度更快。本篇讲清楚两个命令的常用组合和怎么判断监听状态。
一、ss命令(推荐,CentOS7自带)
# 查看所有正在监听的TCP端口
ss -tlnp
# 查看所有正在监听的UDP端口
ss -ulnp
# 统计各类连接数量
ss -s
参数含义:-t TCP、-u UDP、-l 只看监听、-n 数字形式显示端口号(不解析域名/服务名)、-p 显示占用进程。
二、netstat命令(老系统常用,需net-tools)
CentOS7 最小化可能没装,先装:
yum install -y net-tools
常用:
# 查看所有监听的TCP端口和进程
netstat -tlnp
# 查看UDP监听
netstat -ulnp
# 查看80端口被谁占用
netstat -tlnp | grep ':80'
# 查看所有已建立连接
netstat -anp | grep ESTABLISHED
三、判断端口是否在监听
以80端口为例:
ss -tlnp | grep ':80'
# 或
netstat -tlnp | grep ':80'
LISTEN表示正在监听,服务正常;- 没有任何输出说明该端口没被程序监听;
- 最后一列能看到进程名和PID,比如
nginx: worker。
四、常用排查组合
# 查某个具体端口(443)
ss -tlnp | grep 443
# 查某进程监听了哪些端口
ss -tlnp | grep nginx
# 实时看连接数最多的IP
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head
五、常见坑
- 看不到进程名要加 -p,且需要root:普通用户只能看到端口,看不到占用程序,用 sudo 或 root 执行;
- 只看监听不够:服务在本机监听但防火墙/安全组没放行,外网依然连不上,还要配合 firewalld 和云安全组检查;
- netstat 找不到命令:是没装 net-tools,
yum install -y net-tools; - -n 别漏:不加会把80显示成http,grep端口号时容易匹配不到。
总结
记住 ss -tlnp 看 TCP 监听、ss -ulnp 看 UDP、| grep 端口号 精准定位,老机器用 netstat 同参数即可。先确认本机监听,再查防火墙和安全组,排查链路才完整。
遇到问题加QQ23979811 协助处理
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 协助处理