在网络故障排查和系统管理中,检查端口占用情况是一项常见且重要的任务。本文将详细介绍如何使用 netstat 和 lsof 这两个强大的工具来检查端口占用和相关服务。
1. 使用 netstat 查看端口占用
netstat (network statistics) 是一个用于显示网络连接、路由表、接口统计等信息的命令行工具。
1.1 最常用的 netstat 命令
netstat -an
这是最常用的形式,让我们解析其参数:
-a
: 显示所有连接和监听端口
-n
: 以数字形式显示地址和端口号,而不是尝试解析主机名、服务名或端口名
这个命令会显示所有的网络连接,包括 TCP、UDP,以及处于 LISTEN 状态的端口。
1.2 查看占用端口的进程
如果你想知道哪些进程占用了端口,可以添加 -p 参数:
sudo netstat -anp
注意:使用 -p 通常需要 root 权限。
1.3 netstat 输出解析
运行 netstat -anp 后,你会看到类似以下的输出:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp6 0 0 :::80 :::* LISTEN 5678/nginx
udp 0 0 0.0.0.0:68 0.0.0.0:* 910/dhclient
- Proto: 协议(TCP 或 UDP)
- Recv-Q 和 Send-Q: 接收队列和发送队列中的字节数
- Local Address: 本地地址和端口号
- Foreign Address: 远程地址和端口号
- State: 连接状态(如 LISTEN, ESTABLISHED 等)
- PID/Program name: 使用该连接的进程ID和进程名称
1.4 其他有用的 netstat 参数
-t: 仅显示 TCP 连接
-u: 仅显示 UDP 连接
-l: 只显示监听状态(LISTEN)的连接
这些参数可以组合使用,例如:
1.5 查看特定端口
通常,我们的netstat指令要结合grep,比如我们只想查看特定端口(例如 8886):
netstat -an | grep 8886
可以看到-an指令基本上只能看到用什么协议,只是知道这个端口被占用了,让我们来使用-anp
netstat -anp | grep 8886
如果你是普通用户的话,你可以发现,你仍然是看不见的
普通用户需要提权
sudo netstat -anp | grep 8886
然后我可以看到进程号,以及是docker的服务占用了ipv4/ipv6协议下的8886端口
2. 使用 lsof 查看端口占用
lsof (List Open Files) 是另一个强大的工具,不仅可以查看端口占用,还可以查看进程打开的文件。
2.1 基本用法
查看所有网络连接:
sudo lsof -i
查看特定端口(如 8080):
sudo lsof -i :8080
2.2 lsof 输出解析
运行 sudo lsof -i 后,你会看到类似以下的输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN)
nginx 5678 www 6u IPv6 23456 0t0 TCP *:80 (LISTEN)
- COMMAND: 进程名称
- PID: 进程 ID
- USER: 运行该进程的用户
- FD: 文件描述符
- TYPE: 文件类型
- DEVICE: 设备号
- SIZE/OFF: 文件大小或偏移量
- NODE: 节点号
- NAME: 文件名,对于网络连接,显示协议、本地地址、远程地址、状态
3. netstat 和 lsof 的比较
netstat 优势:
更直观的网络连接视图
在大多数系统中默认安装
参数组合灵活,适合快速检查
lsof 优势:
提供更详细的进程信息
可以同时查看文件系统和网络使用情况
在处理大量连接时通常比 netstat 更快
看自己习惯哪个吧