查指定端口(如8080)被谁占用,优先用lsof -i :8080,需加sudo权限;返回空时先补sudo而非换命令;过滤端口必须用grep ':8080'防误匹配。

查端口占用,别先想“用哪个命令”,先看你要解决什么问题:是快速确认某个端口(比如 3000)被谁占了?还是想排查服务起不来、报错 Address already in use?不同场景下,命令选错反而多绕三步。
查指定端口(如 8080)被谁占用,优先用 lsof -i :8080
这个命令最直给——输入端口号,直接吐出进程名、PID、用户、协议类型,字段对齐清晰,不用自己从一堆列里扒信息。它把端口当“文件”处理,逻辑简单,结果也少歧义。
- 必须加
sudo,否则看不到其他用户的进程(比如 root 启的服务) - 如果返回空,不是没占用,而是你没权限读取;别急着换命令,先补
sudo - 输出里
COMMAND列是程序名(如nodejs),PID是数字,后面 kill 就靠它 - 加
-P -n能跳过 DNS 和服务名解析,避免卡顿:sudo lsof -i :8080 -P -n
查所有监听端口并带进程信息,用 ss -tulnp
ss 是内核级工具,比 netstat 快得多,尤其在高连接数机器上,netstat 可能卡住几秒甚至超时。ss -tulnp 一气呵成列出全部 TCP/UDP 监听端口+进程,适合扫一遍当前有哪些服务开着。
-
-tulnp五个参数缺一不可:-t(TCP)、-u(UDP)、-l(LISTEN 状态)、-n(数字端口)、-p(进程) - 没有
sudo时,-p字段会显示-或直接不显示,PID 和程序名全丢,白跑一趟 - 想过滤某端口,别用
| grep 8080,容易误匹配(比如18080也被捞出来),改用| grep ':8080',冒号是关键锚点 - IPv6 地址默认也会显示,若只关心 IPv4,加
-4:sudo ss -4tulnp
旧系统或容器里 lsof/ss 没装,就用 netstat -tulnp
有些最小化镜像(如 alpine 基础镜像)或老旧 CentOS 7 服务器,lsof 和 ss 可能压根没预装,但 netstat 还在。它参数含义和 ss 高度一致,只是慢一点、输出略啰嗦。
- 先确认是否可用:
netstat --version;如果提示command not found,CentOS/RHEL 用sudo yum install -y net-tools,Ubuntu/Debian 用sudo apt install -y net-tools -
netstat -tulnp输出中,PID/Program name这一列可能被截断(比如java...),看不出完整命令名,这时得配合ps -p PID -o cmd=补查 - 某些精简版
netstat不支持-p(尤其非 root 用户),此时只能看到端口和状态,PID 是问号,得切回lsof或ss
只想杀掉占用端口的进程,用 fuser -k 8080/tcp
这不是“查看”命令,但它是“查看完立刻动手”的闭环操作。当你已经确定要干掉那个进程(比如本地开发时 Node 服务卡死),fuser 一行到位,不用先 lsof 查 PID 再 kill -9。
-
tcp必须写明协议,8080/tcp不能简写为8080,否则默认查文件而非端口 -
-k是强制 kill,等价于kill -9,慎用;若想先看看是谁再决定,去掉-k,只执行sudo fuser 8080/tcp - 如果提示
command not found,安装psmisc包:sudo yum install -y psmisc(RHEL/CentOS)或sudo apt install -y psmisc(Debian/Ubuntu) - 注意:它会杀掉所有占用该端口的进程,如果多个服务绑同一个端口(极少见但可能),会一锅端
真正容易被忽略的是权限和协议细节:-p 参数几乎在所有命令里都依赖 root 权限;tcp 和 udp 在 fuser 和 lsof 里必须显式声明;而 grep 过滤时漏掉冒号,就会匹配到错误端口。这些不是“高级技巧”,是每次敲命令前该条件反射检查的点。











