sudo netstat -tulnp 可查看所有监听端口及对应进程,需 root 权限才能显示 PID 和程序名;输出中 Local Address 列标识监听范围,如 0.0.0.0:80 表示全网卡监听,127.0.0.1:3306 表示仅本地访问。

直接用 netstat -tulnp 就能看清哪些端口在监听、谁在用,但必须加 sudo 才能看到进程名和 PID,否则会显示 “Address already in use” 却找不到是谁占的。
怎么看所有监听端口及对应进程
执行以下命令:
- sudo netstat -tulnp:列出全部 TCP/UDP 监听端口,含进程名(如 nginx)、PID(如 1234)和完整路径(如 /usr/sbin/nginx)
- 输出中 Local Address 列很重要:
0.0.0.0:8080表示监听所有网卡;127.0.0.1:3306表示只允许本地访问;:::22是 IPv6 全局监听 - 若提示
command not found,说明 net-tools 未安装,运行 sudo apt install net-tools(UOS/Debian 系)或 sudo yum install net-tools(CentOS/RHEL 系)
怎么快速定位某个端口被谁占了
不用翻完整列表,直接过滤:
- sudo netstat -tulnp | grep ':3306' —— 查 MySQL 默认端口
- sudo netstat -tulnp | grep ':80' —— 查 Web 服务
- 输出类似
tcp6 0 0 *:3306 *:* LISTEN 5678/mysqld,其中 5678 是 PID,mysqld 是进程名 - 如果 grep 没结果,不代表端口空闲——可能服务没启动、绑错地址(比如只绑 127.0.0.1),或用了 UDP 协议(需加 -u 参数)
看到 PID 后怎么确认是不是你要关的进程
光看名字不够,得验证它的真实身份:
- 用 ps -p 5678 -o pid,ppid,cmd,%mem,%cpu 查该进程的启动命令、父进程、内存占用
- 如果是 systemd 管理的服务,可运行 systemctl status 5678,返回里会明确写出
● nginx.service或● redis-server.service - 注意区分同名进程:多个 java 进程都叫 java,得靠
cmd字段看具体启动参数(比如是否含-Dserver.port=8080)
常见误判和注意事项
netstat 显示的信息容易被误解,几个关键点要盯住:
- LISTEN ≠ 服务正常运行:端口开着,但应用可能已崩溃、卡死或没加载配置,需配合日志判断
- PID 为空或显示 -:通常是内核模块、安全软件或权限受限进程,netstat 拿不到信息,建议换 ss -tulnp 或 lsof -i :端口 补充验证
- 大量 TIME_WAIT 是正常的,尤其在高并发短连接场景;但持续增长的 CLOSE_WAIT 往往说明应用没调用 close(),得查代码或框架配置
- 不要一看到 PID 就 kill -9:系统关键进程(如 systemd、dbus、rsyslog)一旦误杀会导致桌面卡死或网络中断

















