排查前的准备工作:确认操作系统类型、获取权限、安装工具
端口排查这事儿,看着简单,但准备工作没做好,后面全是坑。我见过太多人一上来就敲命令,结果权限不够、工具没装,折腾半天啥也没查出来。咱们先把底子打好。
第一步:确认你用的什么系统
不同系统,命令不一样,工具也不一样。你想想看,Windows 上用 netstat -ano,Linux 上却是 ss -tlnp,搞混了只会报错。
怎么确认?很简单:
- Windows:打开 cmd,敲
ver或systeminfo | findstr /B /C:"OS Name" - Linux:敲
uname -a或cat /etc/os-release - macOS:敲
sw_vers或uname -a
我个人习惯,先看一眼终端提示符——Windows 是 C:\>,Linux/macOS 是 $ 或 #。嗯,这招最快。
hostnamectl(Linux)或 systeminfo(Windows),信息一目了然。
第二步:拿到管理员/root 权限
端口排查,说白了就是要看系统底层网络状态。普通用户权限不够,很多关键信息看不到。
我举个例子:Linux 上用 ss -tlnp 查看进程 PID,普通用户只能看到自己的进程,root 才能看到所有。Windows 上 netstat -b 也需要管理员权限,否则直接报错。
怎么获取?
- Windows:右键 cmd 或 PowerShell,选「以管理员身份运行」
- Linux:命令前加
sudo,或者su -切换到 root - macOS:同样用
sudo,或者sudo -i进 root shell
lsof 只显示了部分进程,漏掉了关键的系统服务。排查了半小时才发现是权限问题。所以,一开始就提权,别省这一步。
第三步:安装必要的工具
不同系统预装的工具不一样。咱们得确保手上有这几把「刀」:
| 工具 | Windows | Linux | macOS | 主要用途 |
|---|---|---|---|---|
| netstat | 系统自带 | 通常预装(net-tools) | 系统自带 | 查看端口监听、连接状态 |
| ss | 无 | 预装(iproute2) | 无 | 比 netstat 更快、更详细 |
| lsof | 无 | 需安装 | 预装 | 查看哪个进程打开了端口 |
| Resource Monitor | 系统自带 | 无 | 无 | 图形化查看端口和进程 |
Windows 上的准备
Windows 自带 netstat 和 Resource Monitor,基本够用。但如果你想要更强大的功能,我建议装一个 TCPView(微软 Sysinternals 工具包里的),图形化、实时刷新,排查端口冲突特别好用。
安装方式:去微软官网下载 TCPView,解压即用,无需安装。
Linux 上的准备
Linux 发行版不同,预装情况也不同。我遇到过 CentOS 7 默认没装 lsof,Ubuntu 20.04 默认有 ss 但没有 netstat。所以,建议统一检查一遍:
# 检查 netstat
which netstat || echo "netstat 未安装"
# 检查 ss
which ss || echo "ss 未安装"
# 检查 lsof
which lsof || echo "lsof 未安装"
缺啥装啥:
# Debian/Ubuntu 系列
sudo apt update
sudo apt install net-tools lsof
# CentOS/RHEL 系列
sudo yum install net-tools lsof
# 或者用 dnf(Fedora)
sudo dnf install net-tools lsof
ss 比 netstat 快得多,而且信息更全。我个人习惯优先用 ss,只有在需要看老式输出格式时才用 netstat。但 lsof 是必装的,它能直接告诉你「哪个进程占用了这个端口」,这是 ss 和 netstat 做不到的。
macOS 上的准备
macOS 自带 netstat 和 lsof,基本不用额外装。但 netstat 的参数和 Linux 版略有不同,比如查看监听端口要用 netstat -anvp tcp | grep LISTEN。
如果你想要更现代的工具,可以用 Homebrew 安装 nmap 或 mtr,但排查端口占用,lsof 已经足够了。
# macOS 上查看端口占用的标准姿势
sudo lsof -i :8080
一张图看懂准备工作流程
我把整个准备工作的逻辑画成了流程图,方便你对照执行:
常见问题与避坑
- 装了 net-tools 还是找不到 netstat? 检查一下 PATH,或者直接敲
/usr/sbin/netstat。有些发行版把 sbin 目录排除在普通用户的 PATH 之外。 - macOS 上 lsof 报错「permission denied」? 必须加
sudo,否则看不到其他用户的进程。 - Windows 上 Resource Monitor 怎么打开? 按
Win + R,输入resmon,回车。或者在任务管理器「性能」标签页里点「打开资源监视器」。
ss -tlnp 显示端口被一个 PID 为 1234 的进程占用,但 ps aux | grep 1234 却查不到任何信息。后来才发现,那个进程是容器里的,宿主机上根本看不到。所以,如果你在容器环境下排查,记得先确认是宿主机还是容器内的端口占用。
好了,准备工作做到这一步,你的环境已经齐活了。接下来,咱们就可以正式进入端口排查的实战环节了。