登录
首页 >  文章 >  linux

Linux端口占用查看方法详解

时间:2026-04-29 17:07:00 190浏览 收藏

本文深入解析了Linux下端口占用排查的核心工具——lsof与netstat的实用差异与使用陷阱,明确推荐优先使用lsof,因其直接读取内核文件描述符,能准确捕获TIME_WAIT连接、非root进程及各类监听状态,而netstat在新系统中普遍存在未预装、兼容性差、字段易误读等问题;同时详述了lsof权限限制的应对策略(如sudo、ss替代、精确过滤)、netstat各发行版安装要点与常见误匹配场景,并强调在真正终止进程前需谨慎验证PID有效性、识别容器环境、排除僵尸句柄,避免误杀关键服务——堪称Linux开发者和运维人员高效排障的实战指南。

Linux查看端口占用情况命令 lsof和netstat用法

查端口占用时,lsofnetstat 哪个更可靠?

优先用 lsof。它直接读取内核文件描述符,不依赖网络协议栈状态,能查到已关闭但未完全释放的连接(如 TIME_WAIT 中的 socket),而 netstat 在较新内核(尤其是 CentOS 8+/Ubuntu 20.04+)上默认不预装,且部分实现(如 netstat -tuln)可能漏掉 UDP 端口或非 root 用户启动的进程。

lsof -i :端口号 的常见误用和绕过权限限制的方法

直接运行 lsof -i :8080 可能看不到其他用户或系统服务的进程,因为普通用户无权读取其文件描述符。常见错误现象是返回空结果,但实际端口确被占用。

  • sudo 是最直接的解决方式:sudo lsof -i :8080
  • 若仅想确认是否被监听(不关心进程名),可用 ss -tuln | grep ':8080',它不需要 root 权限也能看到监听状态
  • lsof -iTCP:8080 -sTCP:LISTEN 可精确过滤仅处于监听态的 TCP 连接,避免混入已建立的连接

netstat 在不同发行版上的兼容性问题

netstat 属于 net-tools 包,在 Debian/Ubuntu 上需手动安装:sudo apt install net-tools;RHEL/CentOS 8+ 默认不带,要用 sudo dnf install net-tools。更关键的是,它的输出字段含义易混淆:

  • netstat -tuln 中的 Local Address 列显示 *:22 表示监听所有接口,127.0.0.1:3306 表示只监听本地回环 —— 很多人误以为 * 是通配符匹配,其实它是内核绑定地址的简写
  • netstat -an | grep :3000 可能匹配到 ESTABLISHED 连接的远端端口(比如对方连你 3000,但你本机用的是随机高端口),应配合 -tuln 限定监听态
  • 某些精简镜像(如 Alpine)里只有 busybox netstat,不支持 -p(显示 PID/进程名),此时必须用 lsofss

真正要 kill 占用端口的进程时,别只信 PID

lsof -t -i :3000 输出 PID 后直接 kill $(lsof -t -i :3000) 看似方便,但有风险:多个进程可能共用同一端口(如 systemd socket 激活服务),或 PID 已复用(lsof 查到的是旧进程残留)。更稳妥的做法是先确认进程意图:

  • lsof -i :3000 -P -n 查看完整命令行(-P 禁用端口名解析,-n 禁用主机名解析,避免卡顿)
  • 检查该进程是否属于容器:lsof -i :3000 | grep docker 或看 PID 对应的 /proc/$PID/cgroup
  • 若属 Docker 容器,应 docker ps --filter "expose=3000" -q | xargs docker stop,而非直接 kill 宿主机进程

端口冲突常发生在开发环境快速启停服务时,这时候 lsof 显示的 PID 可能是僵尸句柄,真实进程早已退出 —— 最保险的验证是 nc -zv localhost 3000 看是否真能连上。

到这里,我们也就讲完了《Linux端口占用查看方法详解》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>