端口是否被占用需用ss -tuln | grep ':端口号'验证,有输出即被监听;若需查进程名则加-p或用sudo lsof -i :端口号,注意IPv4/IPv6及本地绑定(如127.0.0.1)的遗漏。

直接看端口有没有进程在监听,有就是被占了,没输出就是空闲。别猜,别跳过验证步骤——很多“以为没占”其实是 ss 没加 -p 导致看不到进程名,或者漏查 IPv6 地址。
用 ss -tuln 快速确认监听状态
这是最轻量、预装率最高、响应最快的方式,适合日常快速筛查:
-
ss -tuln | grep ':80'—— 查 80 端口,:443或:8080同理 - 有输出(如
LISTEN 0 128 *:80 *:*)说明端口处于监听态,即“被占用” - 无输出 ≠ 绝对空闲:它不显示进程名,也默认不查 IPv6 的
[::]:80,得加-6单独查 - 若需同时看 IPv4 和 IPv6,用
ss -tuln | grep -E ':(80|443|8080)'
用 sudo lsof -i :80 定位具体进程
当你需要知道“谁在占”,而不仅是“有没有占”时,lsof 是最直观的选择,但必须加 sudo 才能看到其他用户或系统进程:
-
sudo lsof -i :80输出含COMMAND、PID、NAME三列,一眼识别是nginx、httpd还是残留的node进程 - 如果输出里
NAME列显示*:http (LISTEN)或*:https (LISTEN),说明确实在监听 - 注意过滤干扰项:
sudo lsof -i :80 | grep LISTEN可排除已建立连接但不监听的条目 - 某些容器环境里,
lsof可能不显示 Docker 内部绑定,此时优先信ss -tulnp
用 sudo ss -tulnp 一次性看清端口+进程+权限细节
这是进阶排查的首选命令,尤其适合 Nginx、Apache 启动失败这类典型场景:
-
sudo ss -tulnp | grep ':80'会直接显示类似users:(("nginx",pid=1234,fd=6))的结构 - 关键看
pid和fd(文件描述符),结合/proc/1234/cmdline可确认是否为预期服务 - 如果看到
pid=1或systemd相关,说明端口由 socket 激活机制管理,需查sudo systemctl list-sockets | grep 80 - 注意:部分最小化系统(如 Alpine)默认不带
ss的-p支持,此时退回到lsof更可靠
真正容易被忽略的是:端口占用不只发生在 0.0.0.0:80,还可能精确绑定在 127.0.0.1:80 或 [::1]:80 —— 这类绑定不会阻塞外部访问,但会干扰本地调试。查的时候别只盯通配地址,grep -E ':(80|443|8080)' | grep -v '127.0.0.1' 这类组合过滤往往更贴近实际问题。


















