lsof 与 ss 命令实战:排查端口占用
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
在 Linux 服务器运维中,“Address already in use”(端口已被占用)是最常见的启动报错之一。无论是部署 Nginx 时 80 端口冲突,还是应用重启后旧进程未退出导致 8080 端口无法绑定,快速定位占用端口的进程都是排障第一步。本文介绍 lsof 与 ss 两个命令的实战用法,帮助你在云服务器上一分钟内锁定“元凶”。
一、用 lsof 查看端口占用
lsof(list open files)在 Linux 中一切皆文件,网络套接字也是文件,因此可以用它直接查出占用某端口的进程。最常用的命令是:lsof -i :8080
该命令列出所有使用 8080 端口的进程,输出包含命令名、PID、用户、协议(TCP/UDP)、监听地址和状态(LISTEN/ESTABLISHED)。例如输出中出现 nginx 1234 root 6u IPv4 ... LISTEN,说明 PID 为 1234 的 nginx 正在监听 8080。
常用参数组合:lsof -i TCP:80 -s TCP:LISTEN 只看 80 端口处于 LISTEN 状态的 TCP 连接,过滤掉已建立的连接,结果更干净;lsof -i :80 -P -n 中 -P 禁止把端口号转成服务名(如 http),-n 不做反向 DNS 解析,可显著加快输出;lsof -i -u www 查看某用户(如 web 运行用户 www)打开的所有网络连接。
若提示 command not found,CentOS 系执行 yum install -y lsof,Debian/Ubuntu 系执行 apt install -y lsof 即可。普通用户只能看到自己的进程,建议用 root 或 sudo 执行。
二、用 ss 查看监听与连接状态
ss 是 netstat 的现代替代品,直接读取内核套接字信息,速度更快,系统默认自带。查某个端口被谁监听:ss -tlnp | grep 8080
参数含义:-t 只看 TCP,-l 只看监听状态,-n 以数字显示端口与地址,-p 显示占用进程。输出的最后一列形如 users:(("nginx",pid=1234,fd=6)),同样能拿到 PID。
排查连接堆积时,统计各状态数量很有用:ss -ant | awk '{print $1}' | sort | uniq -c
如果 TIME_WAIT 数量达到数万,说明短连接压力过大;SYN_RECV 异常增多则可能遭遇 SYN Flood,此时建议结合高防服务在入口层清洗流量。
ss 还支持按状态过滤,例如 ss -tnp state established '( dport = :3306 )' 可查看所有连向 MySQL 3306 端口的已建立连接,排查连接数超限时非常直观。
三、定位后如何处置
拿到 PID 后,先确认进程身份再动手:ps -p 1234 -o pid,user,cmd 查看完整启动命令,避免误杀系统关键进程。
处置分三种情况:一是旧进程未退出,执行 kill 1234 正常终止,顽固进程用 kill -9 1234 强杀;二是确有服务冲突,例如 80 端口同时装了 Apache 和 Nginx,应停用其中一个,CentOS 7+ 使用 systemctl stop httpd && systemctl disable httpd 防止开机自启后再次抢占;三是 TIME_WAIT 残留,等待 1~2 分钟内核自动回收,或让应用开启 SO_REUSEADDR(如 Nginx 的 reuseport 配置)避免重启报错。
处置完成后用 ss -tlnp | grep 8080 复查,确认端口已释放,再重启目标服务。
总结
排查端口占用的标准流程可归纳为三步:先用 lsof -i :端口 或 ss -tlnp | grep 端口 找到占用进程与 PID,再用 ps -p PID 确认进程身份,最后按场景选择 kill、停用冲突服务或调整配置。两个命令互为补充:lsof 适合精确查单端口进程,ss 适合快速浏览全局监听与连接状态,建议都纳入日常运维习惯。定期用 ss -tlnp 巡检服务器监听端口,还能及时发现异常监听,是保障云服务器安全的基础动作。