答案是使用netstat、ss或lsof命令可查看Linux进程占用的端口。首先推荐ss命令,如ss -tulnp | grep 8080,能快速显示监听端口及对应进程;其次netstat -tulnp | grep 8080用法类似,但速度较慢;lsof -i :8080可精确查看指定端口的进程信息,包含PID和命令名;若已知PID,可用lsof -p 1234或netstat -tulnp | grep 1234反查端口;无权限时建议使用sudo或检查/proc//cmdline文件确认进程身份;除TCP/UDP外,SCTP等协议需额外参数支持。

查看Linux进程使用的端口号,其实方法很多,关键在于你想要多详细的信息,以及你习惯用哪个命令。最简单粗暴的,当然是
netstat或者
ss,但有时候
lsof也能派上大用场。
解决方案
-
使用
netstat
命令:最常用的方法,简单直接。
netstat -tulnp | grep <端口号或进程名>
-tulnp
:t
显示 TCP 连接,u
显示 UDP 连接,l
显示监听端口,n
以数字形式显示地址和端口 (不进行域名解析),p
显示进程 ID 和进程名。grep <端口号或进程名>
: 过滤结果,可以根据端口号或者进程名来查找。例如,想找8080端口被哪个进程占用,就用grep 8080
。想找nginx进程占用的端口,就用grep nginx
。
示例:
netstat -tulnp | grep 8080
输出类似:
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1234/java
这里
1234
就是进程ID (PID),java
是进程名。 -
使用
ss
命令:ss
是netstat
的替代品,速度更快,效率更高。ss -tulnp | grep <端口号或进程名>
参数含义和
netstat
类似,用法也差不多。示例:
ss -tulnp | grep 8080
输出结果也类似:
tcp LISTEN 0 128 *:8080 *:* users:(("java",pid=1234,fd=72)) -
使用
lsof
命令:lsof
(List Open Files) 功能更强大,可以查看进程打开的所有文件,当然也包括端口。lsof -i :<端口号>
-i :<端口号>
: 指定端口号。
示例:
lsof -i :8080
输出类似:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1234 user 72u IPv6 12345 0t0 TCP *:http-alt (LISTEN)
这里的
1234
同样是进程ID。 -
根据PID查找端口:
有时候你已经知道进程ID,想反过来查它占用的端口。
netstat -tulnp | grep
或者
lsof -p
| grep LISTEN 示例:
netstat -tulnp | grep 1234
lsof -p 1234 | grep LISTEN
为什么netstat
有时候不好使?
netstat虽然经典,但它依赖于
/proc文件系统,而且在某些情况下可能无法提供所有信息。
ss命令通常更快更全面,因为它直接从内核获取信息。所以,如果
netstat没查到,不妨试试
ss。

如何确定端口被哪个程序占用,但没有权限?
如果你的权限不够,无法直接运行
netstat -tulnp,可能会遇到权限问题。这时候,可以尝试使用
sudo,或者联系系统管理员。另一种方法是查看
/proc/文件,前提是你知道PID。虽然不能直接查到端口,但可以间接判断是不是你想找的进程。/cmdline

除了TCP和UDP,还有其他类型的端口吗?
虽然TCP和UDP是最常见的,但Linux也支持其他协议,比如SCTP (Stream Control Transmission Protocol)。
netstat和
ss默认只显示TCP和UDP,如果要查看其他协议,需要指定相应的参数。例如,
ss -at会显示所有 TCP 连接,包括已经建立的和正在监听的。










