在Linux系统中,程序运行时会绑定对应的端口号来提供网络服务,当遇到端口冲突、需要排查异常进程或者确认服务运行状态时,就需要查询程序占用的端口号。常用的查询工具包括netstat、lsof、ss等,不同工具的使用方式和适用场景有所区别。
使用lsof命令查询
lsof是列出当前系统打开文件的工具,在Linux中一切皆文件,网络连接也属于文件范畴,因此可以通过lsof直接查询程序占用的端口。如果要查询指定程序占用的端口,可以使用-c参数指定程序名称,或者使用-p参数指定进程ID。
查询指定程序名占用的端口示例:
# 查询nginx程序占用的所有端口 lsof -c nginx -i # 只显示TCP端口 lsof -c nginx -iTCP # 只显示UDP端口 lsof -c nginx -iUDP
如果要查询指定端口被哪个程序占用,可以使用-i:端口号参数:
# 查询8080端口被哪个程序占用 lsof -i:8080
输出结果中,COMMAND列是程序名称,PID是进程ID,NAME列会显示对应的端口号和连接状态。
使用netstat命令查询
netstat是传统的网络状态查询工具,可以显示网络连接、路由表、接口统计等信息。虽然现在很多系统推荐使用ss替代netstat,但netstat的使用场景依然很广泛。查询程序占用端口时,通常需要结合-tulnp参数使用。
参数含义说明:
-t:显示TCP连接-u:显示UDP连接-l:只显示监听状态的端口-n:以数字形式显示地址和端口号,不解析服务名称-p:显示占用端口的进程ID和程序名称
查询所有监听端口及对应程序的示例:
# 查询所有TCP和UDP监听端口及对应程序 netstat -tulnp
如果要过滤指定程序的端口,可以结合grep命令使用:
# 查询nginx程序占用的端口 netstat -tulnp | grep nginx # 查询8080端口对应的程序 netstat -tulnp | grep :8080
使用ss命令查询
ss是socket统计工具,是netstat的现代替代方案,功能更强大,查询速度也更快,在很多新版本的Linux系统中已经默认安装了ss。ss的参数和netstat类似,查询程序占用端口时同样可以使用-tulnp参数。
查询所有监听端口及对应程序的示例:
# 查询所有TCP和UDP监听端口及对应程序 ss -tulnp
过滤指定程序的端口示例:
# 查询nginx程序占用的端口 ss -tulnp | grep nginx # 查询8080端口对应的程序 ss -tulnp | grep :8080
根据进程ID查询端口
如果已经知道程序的进程ID,也可以通过/proc文件系统直接查询该进程打开的所有网络连接,从而获取占用的端口号。
示例:假设进程ID是1234,查询该进程占用的端口:
# 查看进程1234打开的所有网络连接 ls -l /proc/1234/fd | grep socket # 结合ss命令查询对应的端口信息 ss -p | grep 1234
常见问题说明
如果执行上述命令时提示权限不足,需要在命令前加上sudo获取管理员权限,否则可能无法显示所有进程的信息。另外,如果程序已经退出但端口还处于TIME_WAIT状态,此时查询到的端口不会对应到具体的程序,属于正常的网络状态。
不同命令的输出格式略有区别,但核心信息都包含程序名称、进程ID、协议类型、本地地址和端口号,用户可以根据自己的使用习惯选择合适的命令进行查询。