ss和lsof是查看进程与端口对应关系最可靠的两个命令:ss速度快、内核级、默认预装,执行sudo ss -tulnp | grep :8080可精准显示监听8080端口的进程名及pid;lsof信息最全,支持反查路径与用户,适合精确定位,命令为sudo lsof -i :8080。

直接看进程和端口的对应关系,ss 和 lsof 是最靠得住的两个命令;netstat 在新系统里常要手动装,fuser 适合一键杀进程但信息太简略。
用 ss 查端口和进程(推荐首选)
ss 是内核级工具,速度快、默认预装、输出干净。查 8080 端口是否被占,执行:
sudo ss -tulnp | grep :8080
常见错误现象:不加 sudo 时 Process 字段为空,看不到 PID 和进程名;漏掉 -n 会导致 DNS 解析卡顿,尤其在无网环境;grep 8080(不带冒号)可能误匹配到 80801 这类端口。
关键参数含义:
-
-t:只看 TCP(UDP 用-u) -
-l:只显示 LISTEN 状态(排除已建立连接的干扰) -
-n:端口以数字显示(不查/etc/services) -
-p:显示进程,必须 root 权限
输出中 users:(("java",pid=12345,fd=52)) 表示进程名是 java,PID 是 12345。
用 lsof 查端口(信息最全,适合精确定位)
lsof 把端口当“文件”处理,能直接反查进程路径、用户、启动命令等,对同名多实例场景特别有用。查 3306 端口:
sudo lsof -i :3306
容易踩的坑:
- 不加
-P和-n会尝试解析服务名和主机名,慢且可能失败 - 如果端口处于非 LISTEN 状态(如 TIME_WAIT),需补
-sTCP:LISTEN或直接用-iTCP限定协议 - 查不到结果?确认端口确实在监听——有些服务只绑定
127.0.0.1,而lsof -i :3306默认匹配所有地址
输出字段里 COMMAND 是进程名,PID 是进程 ID,NAME 列的 *:3306 (LISTEN) 表明是监听状态。
用 fuser 快速终止占用进程(慎用)
fuser 不展示进程详情,只返回 PID,但支持一键杀,适合脚本或紧急释放:
sudo fuser 8080/tcp → 输出类似 8080/tcp: 12345
sudo fuser -k 8080/tcp → 直接 kill 掉该 PID
注意点:
- 必须指定协议,
8080/tcp和8080/udp是两回事 -
-k默认发SIGKILL(即kill -9),无法触发进程优雅退出,可能丢数据 - 没有
-v时输出极简,看不出是哪个用户、什么程序,误杀风险高
netstat 已过时但旧系统还得用
很多容器镜像、嵌入式设备或 CentOS 7 以下系统没装 ss 或 lsof,只能靠 netstat。先确认是否可用:
netstat -V → 若提示 command not found,需安装:
Ubuntu/Debian:sudo apt install net-tools
CentOS/RHEL:sudo yum install net-tools
查端口命令和 ss 高度一致:
sudo netstat -tulnp | grep :8080
性能差异明显:netstat 要遍历 /proc 下所有进程,ss 直接读内核 socket 表;同一台机器上,ss 执行时间通常是 netstat 的 1/10。
真正容易被忽略的是权限问题——哪怕你只是想看端口列表,只要加了 -p,就必须 sudo,否则 PID 和进程名永远为空。











