Linux查看服务器端口号,核心就一句话:用ss -tlnp命令,分别是查看TCP监听端口及对应进程,这是当前最准确、最推荐的做法。比起老牌的netstat,ss命令在现代Linux系统上速度更快、信息更全,我会把查看端口的各种场景和命令拆开揉碎讲清楚,保证你看完就能上手。
linux查看端口号命令有哪些:从入门到进阶
很多朋友刚接触Linux时,第一反应是问“端口号在哪看”,Linux没有图形界面让你点鼠标,全靠命令行,这就是linux查看端口号命令的用武之地,我会按使用频率和场景,把命令分为三类,你按需取用。
基础必备:ss命令的详细用法
ss是iproute2包的一部分,几乎所有现代Linux发行版都预装了它,它的语法比netstat更简洁,内核信息读取机制也更高效。
- 查看所有监听的TCP端口:这是最常用的场景,执行
ss -tln,拆解一下参数:-t表示只显示TCP协议,-l表示只显示监听状态的端口,-n表示以数字形式显示端口号和IP地址,不做域名反向解析,这样速度更快、输出更清晰。 - 查看所有监听的UDP端口:把
-t换成-u,即ss -uln,UDP端口常用于DNS、NTP、视频流等服务。 - 查看所有端口(包含已建立的连接):去掉
-l,执行ss -tan,这会把所有TCP连接都列出来,包括ESTAB(已建立)、TIME-WAIT等状态,如果你想看当前服务器有多少活跃连接,用这个。 - 查看具体进程信息:在基础命令上加上
-p参数,即ss -tlnp,这能显示哪个进程占用了哪个端口,需要root权限才能看到完整信息,如果是普通用户,可能只能看到自己的进程。
解读:
State列显示监听状态(LISTEN),Recv-Q和Send-Q是接收和发送队列,一般情况下监听端口这两个值都是0。Local Address:Port是关键,比如0.0.0:22表示所有IPv4地址的22端口都在监听,[::]:80表示所有IPv6地址的80端口在监听。Users:(("sshd",pid=1234,fd=3))这行就是进程信息,sshd是进程名,pid=1234是进程号。
老牌工具:netstat命令及安装方法
虽然在很多新系统中netstat不再是默认安装,但它依然是排查问题的得力助手,如果提示command not found,在CentOS/RHEL系用yum install net-tools,在Ubuntu/Debian系用apt install net-tools。
- 基本语法:
netstat -tlnp,参数含义与ss大同小异,-p同样需要root权限。 - 与ss命令的差异:
netstat还支持-i显示网卡信息,-r显示路由表,虽然在纯端口查看上两者功能重叠,但处理高并发连接时,ss的速度优势非常明显,因为netstat会遍历/proc/net下的文件,而ss直接读取内核内存,行业共识认为,在高流量服务器上,ss是更优选择。
精准定位:lsof命令
lsof是“list open files”的缩写,在Linux世界里“一切皆文件”,网络连接也是文件,所以它能很灵活地按端口或进程查询。
- 按端口查进程:
lsof -i:8080,直接查看8080端口被谁占用,会列出进程名、PID和用户。 - 按进程查端口:
lsof -i -P | grep nginx,先列出所有网络文件,再过滤出nginx相关的,-P参数同样是为了禁止端口名解析。 - 查看所有监听端口:
lsof -iTCP -sTCP:LISTEN -P,这个命令会列出所有TCP监听端口,信息比ss更详细,如果你的服务器上没装lsof,同样可以用包管理器安装,它是排查端口占用问题的常用工具。
服务器端口被占用怎么解决:排查与处理实战
在工作中,你可能会遇到启动服务时提示“端口已被占用”,这通常意味着另一个程序已经捆绑了该端口。服务器端口被占用怎么解决是运维新手最常见的困惑,我们来梳理一套标准的排查思路。
定位占用端口的“元凶”
关键在于找到PID(进程ID),假设遇到8080端口被占用。
- 使用
lsof快速定位:执行lsof -i:8080。 - 使用
ss定位:执行ss -tlnp | grep 8080,或者ss -tlnp 'sport = :8080',我们也常在后面看到提示“java”或“nginx”等进程名。 - 使用
fuser命令:fuser 8080/tcp,这个命令直接输出占用8080端口TCP连接的进程PID,非常直接,加上-v参数可以显示更详细的信息。
得到PID后,执行 ps -ef | grep <PID> 就能看到是哪个程序,执行 ls -l /proc/<PID>/exe 可以看到这个进程的可执行文件路径。
处理端口占用的几种有效方式
确认进程后,根据业务性质决定下一步。
- 如果是无用的僵尸进程:执行
kill -9 <PID>。 - 如果是需要升级或重启的服务:执行
systemctl restart <服务名>。 - 如果是你自己运行在后台的进程:执行
kill <PID>,如果杀不掉再考虑-9。 - 更优雅的方式:使用
pkill按名称杀进程,pkill -f 'java -jar app.jar',注意,pkill会匹配进程名,小心勿杀。
这里有个极易出错的地方:改了配置文件后,服务进程不会自动重载,你需要先查看到旧PID,再确认它是被systemd管理还是直接运行的命令,如果是systemd服务,systemctl restart会正确处理;如果是手动启动的,你需要先手动kill旧进程再启动新进程。
防火墙对端口的影响
你发现服务在服务器内部能访问,但外部访问不了,但端口明明是监听状态,这时多半是防火墙策略问题,Linux的firewalld和iptables是两套常见工具。
- firewalld(CentOS 7+默认):执行
firewall-cmd --list-ports查看已放行的端口,如需放行8080端口,执行firewall-cmd --zone=public --add-port=8080/tcp --permanent,firewall-cmd --reload。 - iptables:执行
iptables -L -n查看当前规则,但请注意,iptables规则很复杂,如果没把握,不要随意修改。
还有云服务商的安全组规则,比如简米云、酷番云,也需要在控制台检查对应端口是否在入方向规则中放行。
根据端口号查找对应进程:反向追踪技巧
很多时候我们拿到一个端口号,需要知道背后是什么服务。根据端口号查找对应进程这个需求,在安全管理、应用排错时特别常见。
通过PID查询进程详情
还是以8080为例,先用ss -tlnp | grep 8080拿到PID,假设是5678。
执行 ps -p 5678 -o pid,ppid,user,cmd,结果中cmd列会显示完整的启动命令,比如/usr/local/jdk/bin/java -jar /opt/app/app.jar,这就非常清楚了。
如果你想知道这个进程是从哪个目录启动的,执行 readlink -f /proc/5678/cwd。
端口与进程的关系梳理
端口是网络传输层(TCP/UDP)的标识,进程是操作系统资源管理的单位,内核负责把数据包分发到对应端口的进程,一个端口同时只能被一个进程监听,但一个进程可以监听多个端口,比如Nginx的80和443端口。
| 查询需求 | 推荐命令 | 说明 |
|---|---|---|
| 查所有TCP监听端口 | ss -tln |
最快,最常用 |
| 查具体端口占用的进程 | lsof -i:端口号 |
直观显示PID和进程名 |
| 查所有UDP监听端口 | ss -uln |
适合排查DNS等服务 |
| 查进程监听了哪些端口 | ss -tlnp \| grep PID |
反向查询 |
| 查外部连接情况 | ss -tan |
查看服务器收到的外部连接 |
实战:排查“地址已被使用”的错误
启动一个Java应用(如Spring Boot),提示BindException: Address already in use,此时不要慌。
- 用
lsof -i:8080看看,如果输出一堆,第一行是COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME,关注PID和NAME列,NAME里的:8080 (LISTEN)表示正在监听。 - 如果找不到,试试
netstat -tlnp | grep 8080,有时候是权限不够导致lsof没显示末尾的PID信息,加sudo再试。 - 另一种情况是端口处于TIME_WAIT状态,这不是进程占用,而是连接关闭后的残留状态,默认TIME_WAIT持续60秒,属于正常现象,如果服务老是报地址被占用,需要调整内核参数或应用配置,比如设置
SO_REUSEADDR。
linux查询服务端口号:围绕服务的端口操作
日常运维中,你更多是围绕某个服务来查端口,我的Nginx跑在哪个端口?”这不同于单纯根据端口找进程。
- 根据服务名查:如果你知道服务名,用
systemctl status nginx查看服务状态和主PID,然后用ss -tlnp | grep <PID>查询该PID监听的所有端口,或者更直接,ss -tlnp | grep nginx。 - 根据配置文件查:服务的端口一般在配置文件中定义,Nginx的
/etc/nginx/nginx.conf中的listen指令;MySQL的/etc/my.cnf中的port参数;Redis的/etc/redis.conf中的port,直接cat或grep对应配置文件即可。 - 查看本机所有服务的监听端口清单:一条
ss -tlnp命令,配合grep,就能快速梳理出当前机器上所有服务的端口映射,对于多服务部署的服务器,这个技巧能帮你快速建立一份“端口-服务”对照表。
Q&A:linux查看端口号的常见疑问
Q1:ss命令和netstat命令哪个更可靠?
A1:ss更可靠且更高效,它直接读取内核的socket统计信息,而netstat需要解析/proc/net文件系统,在高并发、大量连接的场景下,ss不会消耗太多CPU资源,输出也很稳定,除非你在排查非常老旧的系统或需要netstat -i这类网卡统计信息,否则优先推荐使用ss,在绝大多数现代Linux发行版中,ss已是标配。
Q2:为什么用普通用户执行ss -tlnp只能看到端口,看不到进程PID?
A2:这是权限限制,进程信息属于敏感数据,只有root用户才能查看所有进程的PID和名称,普通用户只能看到自己拥有的进程,在排查系统级问题时,你需要切换到root用户或在命令前加sudo,例如执行sudo ss -tlnp,才能获得完整的“端口-进程”对应关系。
Q3:使用lsof -i:8080找不到任何信息,但服务确实无法启动,提示端口被占用,可能是什么原因?
A3:可能原因有三,第一,你查询的进程属于其他用户,且你没有权限查看,需要加上sudo重试,第二,该端口可能处于TIME_WAIT状态,它不归属于任何正在运行的进程,但依然会阻止一些严格的程序重新绑定,可以用ss -tan state time-wait 'sport = :8080'确认,第三,IPv6和IPv4的差异,某些服务监听在(IPv6)地址上,而lsof默认输出可能让你忽略它,尝试lsof -iTCP:8080 -sTCP:LISTEN -P -n,这个命令能更完整地显示所有IP协议下的监听状态。
掌握Linux端口查看命令,是服务器管理和故障排查的基本功。记住ss -tlnp和lsof -i:端口号这两个核心命令,就能解决绝大部分问题,前者给你全貌,后者帮你精准定位,遇到陌生端口,先查监听状态,再确认进程归属,最后检查防火墙和云安全组策略,这套流程走下来,端口相关的疑难杂症基本都能迎刃而解。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/783451.html


