当前位置: 首页 > 科技观察

谁在Linux占用了我的端口

时间:2023-03-19 01:12:32 科技观察

Addressalreadyinuse这种提示,想必大家都遇到过,如何快速找到问题并解决?有几种姿势需要理解。在网络连接或特定的应用程序问题上进行故障排除时,您应该检查的第一件事是系统上实际使用了哪些端口,以及哪个应用程序正在侦听特定端口。本文介绍了如何使用netstat、ss和lsof命令找出哪些服务正在侦听哪些端口。这些说明适用于所有基于Linux和Unix的操作系统,例如macOS。#什么是监听端口?网络端口由其编号、关联的IP地址和通信协议类型(如TCP或UDP)标识。侦听端口是应用程序或进程侦听的网络端口,充当通信端点。每个侦听端口都可以使用防火墙打开或关闭(过滤)。一般来说,开放端口是接受来自远程位置的传入数据包的网络端口。你不能让两个服务监听同一个IP地址上的同一个端口。例如,如果您正在运行侦听端口80和443的ApacheWeb服务器,并且您尝试安装Nginx,后者将无法启动,因为HTTP和HTTPS端口已被使用。#用netstat检查监听端口netstat是一个提供网络连接信息的命令行工具。要列出所有侦听的TCP或UDP端口,包括使用端口和套接字状态的服务,请使用以下命令:sudonetstat-tunlp该命令中使用的选项具有以下含义:-t-显示TCP端口。-u-显示UDP端口。-n-显示数字地址而不是解析主机。-l-只显示监听端口。-p-显示侦听进程的PID和名称。仅当您以root或sudo用户身份运行命令时才会显示此信息。输出将如下所示:ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/Programnameetcp000:220:*LISTEN445/sshdtcp000:250:*LISTEN929/mastertcp600:::3306::*LISTEN534/mysqldtcp600:::80:::*LISTEN515/60apache2t:22:::*LISTEN445/sshdtcp600:::25:::*LISTEN929/mastertcp600:::33060:::*LISTEN534/mysqldudp000:680:*966/dhclient在我们的例子中,重要的列是:Proto-协议由套接字使用。本地地址-进程正在侦听的IP地址和端口号。PID/Programname-PID和进程名称。如果要过滤结果,请使用grep命令。例如,要查找监听TCP端口22的进程,您可以输入:sudonetstat-tnlp|grep:22输出显示端口22被这台计算机上的SSH服务器使用:tcp000:220:*LISTEN445/sshdtcp600:::22:::*LISTEN445/sshd如果输出为空,则表示端口上没有任何监听。您还可以根据PID、协议、状态等条件过滤列表。netstat已过时,被ss和ip取代,但它仍然是检查网络连接的最常用命令。#使用ss检查监听端口ss是新的netstat。它缺少netstat的某些功能,但公开了更多的TCP状态并且速度稍快。命令选项基本相同,因此从netstat转换为ss并不困难。要使用ss获取所有侦听端口的列表,请输入:sudoss-tunlp输出几乎与netstat报告的相同:StateRecv-QSend-QLocalAddress:PortPeerAddress:PortLISTEN01280:220:*users:(("sshd",pid=445,fd=3))LISTEN01000:250:*用户:(("master",pid=929,fd=13))LISTEN0128*:3306*:*用户:(("mysqld",pid=534,fd=30))LISTEN0128*:80*:*users:(("apache2",pid=765,fd=4),("apache2",pid=764,fd=4),("apache2",pid=515,fd=4))LISTEN0128[::]:22[::]:*用户:(("sshd",pid=445,fd=4))LISTEN0100[::]:25[::]:*用户:(("master",pid=929,fd=14))LISTEN070*:33060*:*users:(("mysqld",pid=534,fd=33))#使用lsof查看监听端口lsof是一个强大的工具命令行提供有关进程打开的文件的信息的应用程序。在Linux中,一切皆文件。您可以将套接字视为写入网络的文件。要使用lsof获取所有侦听TCP端口的列表,请输入:sudolsof-nP-iTCP-sTCP:LISTEN使用以下选项:-n-不要将端口号转换为端口名称。-p-不解析主机名,显示数字地址。-iTCP-sTCP:LISTEN-只显示TCP状态为LISTEN的网络文件。COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEsshd445root3uIPv4164340t0TCP*:22(LISTEN)sshd445root4uIPv6164450t0TCP*:22(LISTEN)apache2515root4uIPv6165900t0TCP*:80(LISTEN)mysqld534mysql30uIPv6176360t0TCP*:3306(LISTEN)mysqld534mysql33uIPv6199730t0TCP*:33060(LISTEN)apache2764www-data4uIPv6165900t0TCP*:80(LISTEN)apache2765www-data4uIPv6165900t0TCP*:80(LISTEN)master929root13uIPv4196370t0TCP*:25(LISTEN)master929root14uIPv6196380t0TCP*:25(LISTEN)大多数输出??列名都是不言自明的:COMMAND、PID、USER-与端口关联的运行程序的名称,PID和用户。名称-端口号。要查找正在侦听特定端口(例如端口3306)的进程,您可以使用:sudolsof-nP-iTCP:3306-sTCP:LISTEN输出显示MySQL服务器使用端口3306:COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEmysqld534mysql30uIPv6176♂t0TCP*:3306(听)