Linux 查看端口占用:netstat、ss、lsof 谁更好用?

Linux 查看端口占用:netstat、ss、lsof 谁更好用?

1. 前言

在 Linux 部署服务时,经常会遇到端口相关问题:

  • 启动服务时报 Address already in use
  • 想知道 80 端口被谁占用;
  • 想查看当前系统开放了哪些端口;
  • 想确认服务到底有没有监听;
  • 想结束占用端口的进程。

常用工具有三个:

复制代码
netstat
ss
lsof

本文从端口排查角度讲清楚它们怎么用、有什么区别,以及实际项目中应该优先用哪个。


2. 端口占用是什么意思

当程序监听某个端口时,其他程序通常不能再监听同一个 IP 和端口组合。

例如 Nginx 已经监听 80 端口:

复制代码
0.0.0.0:80

此时另一个程序再绑定 80 端口,就可能报错:

复制代码
Address already in use

端口排查的核心就是找到:

复制代码
哪个进程占用了哪个端口

3. ss:推荐优先使用

ss 是 socket statistics 的缩写。

它是现在 Linux 中更推荐使用的网络查看工具。

查看所有 TCP 监听端口:

复制代码
ss -lntp

参数说明:

参数 含义
-l 只看监听状态
-n 数字显示,不解析服务名
-t TCP
-u UDP
-p 显示进程信息

查看 80 端口:

复制代码
ss -lntp | grep ':80'

示例输出:

复制代码
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

可以看到:

复制代码
端口:80
进程:nginx
PID:1234

4. ss 查看 UDP 端口

查看 UDP 监听端口:

复制代码
ss -lnup

查看 TCP 和 UDP:

复制代码
ss -lntup

如果没有 -p 权限,普通用户可能看不到进程名。

可以使用 sudo:

复制代码
sudo ss -lntp

5. netstat:传统工具

netstat 是老牌网络工具。

很多教程中都会看到它。

查看监听端口:

复制代码
netstat -lntp

参数含义和 ss 类似:

参数 含义
-l listening
-n 数字显示
-t TCP
-u UDP
-p 显示进程

查看所有 TCP/UDP 监听端口:

复制代码
netstat -lntup

查看 3306 端口:

复制代码
netstat -lntp | grep ':3306'

6. netstat 可能没有安装

很多新系统默认不再安装 netstat。

如果提示:

复制代码
netstat: command not found

可以安装 net-tools。

Ubuntu / Debian:

复制代码
sudo apt install net-tools

CentOS / RHEL:

复制代码
sudo yum install net-tools

不过新环境中更推荐直接使用 ss


7. lsof:从文件角度看端口

Linux 中"一切皆文件"。

网络 socket 也可以看成进程打开的文件。

lsof 用于查看进程打开了哪些文件,也能查端口。

查看 80 端口:

复制代码
sudo lsof -i :80

输出示例:

复制代码
COMMAND PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234 root   6u   IPv4  12345      0t0  TCP *:http (LISTEN)

查看 TCP 端口:

复制代码
sudo lsof -iTCP:80 -sTCP:LISTEN

查看某个进程打开的网络连接:

复制代码
sudo lsof -i -p 1234

8. 三者区别

工具 特点 推荐场景
ss 新、快、系统常见 日常端口查看优先用
netstat 老牌、资料多 老系统或旧教程场景
lsof 能关联进程打开文件 精确查某端口被谁占用

简单建议:

复制代码
看监听端口:ss -lntp
查端口进程:lsof -i :端口
兼容旧教程:netstat -lntp

9. 查看端口是否监听

例如检查 8080:

复制代码
ss -lntp | grep ':8080'

如果有输出,说明有服务监听。

如果没有输出,说明本机没有服务监听该端口。

也可以:

复制代码
sudo lsof -i :8080

10. 查看所有开放端口

复制代码
sudo ss -lntup

输出中重点看 Local Address:Port。

示例:

复制代码
0.0.0.0:22
127.0.0.1:3306
0.0.0.0:80

含义:

地址 含义
0.0.0.0:80 所有网卡都监听 80
127.0.0.1:3306 只允许本机访问 3306
[::]:22 IPv6 所有地址监听 22

11. 127.0.0.1 和 0.0.0.0

这是端口排查中非常关键的点。

如果服务监听:

复制代码
127.0.0.1:8080

只能本机访问。

如果监听:

复制代码
0.0.0.0:8080

外部机器可以通过服务器 IP 访问。

例如:

复制代码
curl http://127.0.0.1:8080

本机成功,但外部访问失败。

这时要检查服务是否只绑定了 127.0.0.1


12. 根据 PID 查看进程

如果查到 PID 为 1234:

复制代码
ps -fp 1234

查看进程启动命令:

复制代码
cat /proc/1234/cmdline

格式可能没有换行,可以用:

复制代码
tr '\0' ' ' < /proc/1234/cmdline

查看进程工作目录:

复制代码
ls -l /proc/1234/cwd

13. 结束占用端口的进程

先查端口:

复制代码
sudo lsof -i :8080

假设 PID 是 1234,正常结束:

复制代码
kill 1234

如果无法退出:

复制代码
kill -9 1234

更推荐先优雅停止服务:

复制代码
systemctl stop 服务名

不要一上来就 kill -9,否则可能导致数据未写完或资源没有清理。


14. 实战:8080 端口被占用

启动服务时报错:

复制代码
Address already in use: 8080

排查:

复制代码
sudo ss -lntp | grep ':8080'

或:

复制代码
sudo lsof -i :8080

找到进程后:

复制代码
ps -fp PID

如果是旧服务,可以停止:

复制代码
kill PID

如果是 systemd 服务:

复制代码
systemctl status 服务名
systemctl stop 服务名

15. 实战:服务启动了但外部访问不了

本机查看:

复制代码
ss -lntp | grep ':8080'

如果看到:

复制代码
127.0.0.1:8080

说明只监听本机。

需要修改应用配置,把监听地址改成:

复制代码
0.0.0.0

如果看到:

复制代码
0.0.0.0:8080

但外部仍访问不了,继续排查:

复制代码
firewall-cmd --list-ports
iptables -L -n

还要检查云服务器安全组。


16. 小结

查看端口占用推荐这样用:

复制代码
ss -lntp
sudo ss -lntup
sudo lsof -i :8080
netstat -lntp

三者选择:

复制代码
ss:日常首选
netstat:旧系统兼容
lsof:精确查端口对应进程

端口排查核心流程:

复制代码
看端口是否监听
↓
看监听地址是 127.0.0.1 还是 0.0.0.0
↓
看对应进程和 PID
↓
看服务状态
↓
看防火墙和安全组

掌握这些命令后,大多数"端口被占用"和"服务访问不了"的问题都能快速定位。

相关推荐
AlfredZhao19 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院2 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展