CentOS7 lsof命令查找端口对应服务名

端口被哪个进程偷偷占用?在 CentOS7 上,**lsof -i:端口号** 一条命令就能揪出幕后服务。别急着重启机器,先学会这一招,省下半个小时排障时间。

为什么必须用 lsof 而不是 netstat
netstat 已经默认不装,lsof 自带详细信息,**PID、用户、协议、服务名一次给全**。更重要的是,它能直接反向查询:已知端口,瞬间定位进程路径,再顺藤摸瓜找到启动脚本。
安装与首次运行
最小化安装的 CentOS7 可能没带 lsof,**yum -y install lsof** 十秒搞定。首次执行建议加 sudo,避免权限不足看不到完整列表。
一条命令格式记一辈子
sudo lsof -i :3306

回车后立刻呈现四列关键信息:COMMAND、PID、USER、NAME。NAME 列把本地地址与端口拼在一起,**0.0.0.0:3306 表示全网监听**,127.0.0.1:3306 仅本地回环。
被占用却看不到服务名?这样破
有时输出里 COMMAND 是 java、python 这类通用词,看不出业务含义。接着执行 ls -lh /proc/PID/exe,**软链接会指向真实可执行文件**,比如 /opt/mysqld。若 exe 指向已删除文件,**rm 未重启的进程就是元凶**,直接重启服务即可释放端口。
UDP 端口同样适用
别误以为 lsof 只能查 TCP,**lsof -i UDP:514** 一样能把 syslog-ng 揪出来。加上 **-n -P** 参数禁用反向解析,速度再快两成,脚本里批量巡检尤其好用。
批量扫描常用端口
把下面三行写进脚本,**5 秒钟完成 22、80、443、3306、6379、8080 全检测**:
for port in 22 80 443 3306 6379 8080; do
echo === $port ===
sudo lsof -i :$port | grep LISTEN
done
输出为空即端口闲置,**非空行立刻给出 PID**,KILL 或调整配置随你挑。
防火墙与 SELinux 别背锅
很多新手端口不通就怪 firewall-cmd,**先用 lsof 确认本地是否监听**,再谈放行。若本地无监听,加规则也是徒劳;**若本地已监听仍无法远程连接**,再去检查 zones 与 rich-rules。
生产环境排障实录
上周线上 8080 突然失踪,**lsof -i :8080** 发现 PID 不断变动,判定为脚本循环启动。结合 **ps -ef | grep PID** 找到启动脚本路径,**注释掉 while 段落**后世界安静。若没有 lsof,这段排查至少多花二十分钟。
常见误区一次讲清
误区一:看到 LISTEN 就以为能对外服务——**127.0.0.1 仅限本机**。
误区二:杀掉进程却不改配置,**systemctl 会秒级重启**,端口又被占用。
误区三:只看 TCP 忽略 UDP,**DNS、NTP、日志传输全走 UDP**,漏掉等于白查。
把命令拆成可记忆口诀
“**sudo lsof -i :端口**
**exe 路径看进程**
**无结果即闲置**
**有 PID 直接干**”
四句话默念三遍,**下次值班再也不用手忙脚乱翻文档**。
端口冲突不再神秘,**lsof 就是 CentOS7 的瑞士军刀**。记住格式、活用参数、结合 /proc 深挖,**五分钟定位问题,三分钟给出解决方案**,剩下的时间喝杯咖啡不香吗?
