Linux查询某个端口被占用的方法
Address already in use这个提示,想必大家遇到过,怎么能快速找到问题并解决呢?下面有几种姿势可以了解一下.
在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的事情之一应该是系统上实际使用了哪些端口,以及哪个应用程序正在侦听特定的端口。
本文介绍了如何使用命令找出哪些服务正在侦听哪些端口。该说明适用于所有基于Linux和Unix的操作系统,例如macOS。
什么是监听端口
网络端口由其编号,关联的IP地址和通信协议(例如TCP或UDP)的类型标识。
侦听端口是应用程序或进程在其上侦听的网络端口,充当通信端点。
每个监听端口都可以使用防火墙打开或关闭(过滤)。一般而言,开放端口是一个网络端口,它接受来自远程位置的传入数据包。
你不能让两个服务监听同一IP地址上的同一端口。
例如,如果你正在运行一个监听端口80和443的Apache Web服务器,并且尝试安装Nginx ,则后者将无法启动,因为HTTP和HTTPS端口是已经在使用中。
1:命令ss
检查监听端口
ss是新的netstat。它缺少netstat的某些功能,但是公开了更多的TCP状态,并且速度稍快。命令选项基本相同,因此从netstat到ss的转换并不困难。
要使用ss获取所有监听端口的列表,请输入:
ss -ntl
[root@app1812365 ~]# ss -ntl |grep 9090
LISTEN 0 128 :::9090 :::*
2:命令netstat
netstat是一个命令行工具,可以提供有关网络连接的信息。
要列出所有正在侦听的TCP或UDP端口,包括使用端口的服务和套接字状态,请使用以下命令:
netstat -tunlp
此命令中使用的选项具有以下含义:
- -t -显示TCP端口。
- -u -显示UDP端口。
- -n -显示数字地址而不是解析主机。
- -l -仅显示监听端口。
- -p -显示侦听器进程的PID和名称。仅当你以root用户或 sudo 用户身份运行命令时,才会显示此信息。
[root@app1812365 ~]# netstat -tanlp |grep 9090
tcp6 0 0 :::9090 :::* LISTEN 60886/./sniper
3:lsof
检查监听端口
lsof是功能强大的命令行应用程序,可提供有关进程打开的文件的信息。
在Linux中,所有内容都是文件。你可以将套接字视为写入网络的文件。
[root@app1812365 ~]# lsof -i:9090
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sniper 60886 root 34u IPv6 937287521 0t0 TCP *:websm (LISTEN)
使用的选项如下:
- -n-不要将端口号转换为端口名称。
- -p -不解析主机名,显示数字地址。
[root@app1812365 ~]# lsof -nP -iTCP -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 34u IPv4 1551535 0t0 TCP *:111 (LISTEN)
systemd 1 root 36u IPv6 1551537 0t0 TCP *:111 (LISTEN)
rpc.statd 8892 rpcuser 9u IPv4 1552017 0t0 TCP *:48169 (LISTEN)
rpc.statd 8892 rpcuser 11u IPv6 1552025 0t0 TCP *:33526 (LISTEN)
rpcbind 17251 rpc 4u IPv4 1551535 0t0 TCP *:111 (LISTEN)
rpcbind 17251 rpc 6u IPv6 1551537 0t0 TCP *:111 (LISTEN)
rpc.mount 29903 root 8u IPv4 443337633 0t0 TCP *:892 (LISTEN)
rpc.mount 29903 root 10u IPv6 443338326 0t0 TCP *:892 (LISTEN)
gov_defen 35507 root 56u IPv4 782876729 0t0 TCP *:5555 (LISTEN)
sshd 47817 root 8u IPv6 943206101 0t0 TCP [::1]:6010 (LISTEN)
sshd 47817 root 9u IPv4 943206102 0t0 TCP 127.0.0.1:6010 (LISTEN)
sshd 49890 root 3u IPv4 82447384 0t0 TCP *:22 (LISTEN)
sshd 49890 root 4u IPv6 82447386 0t0 TCP *:22 (LISTEN)
sniper 60886 root 34u IPv6 937287521 0t0 TCP *:9090 (LISTEN)
java 64932 ekp 43u IPv4 916306241 0t0 TCP *:8080 (LISTEN)
java 64932 ekp 44u IPv4 916306242 0t0 TCP *:8009 (LISTEN)
java 64932 ekp 46u IPv4 916310218 0t0 TCP 127.0.0.1:8005 (LISTEN)
java 64932 ekp 486u IPv4 916308389 0t0 TCP *:7800 (LISTEN)
[root@app1812365 ~]# lsof -nP -iTCP:9090 -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sniper 60886 root 34u IPv6 937287521 0t0 TCP *:9090 (LISTEN)
[root@app1812365 ~]# lsof -nP -iTCP:9090
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sniper 60886 root 34u IPv6 937287521 0t0 TCP *:9090 (LISTEN)
4:fuser
fuser命令和lsof正好相反,是查看某个文件被哪个进程占用的。Linux中,万物皆文件,所以可以查看普通文件、套接字文件、文件系统。而套接字文件就包含了端口号。比如查看9090端口。
每个进程号后面都跟随一个字母,该字母指示进程如何使用文件。
- c:指示进程的工作目录。
- e:指示该文件为进程的可执行文件(即进程由该文件拉起)。
- f:指示该文件被进程打开,默认情况下f字符不显示。
- F:指示该文件被进程打开进行写入,默认情况下F字符不显示。
- r:指示该目录为进程的根目录。
- m:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。
语法
fuser [选项] [参数]
选项
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间;
-u:在每个进程后显示所属的用户名。
参数
文件:可以是文件名或者TCP、UDP端口号。
root@ubuntu-n1:~# fuser 10050/tcp -v
用户 进程号 权限 命令
10050/tcp: zabbix 765 F.... zabbix_agentd
zabbix 767 F.... zabbix_agentd
zabbix 768 F.... zabbix_agentd
zabbix 769 F.... zabbix_agentd
zabbix 770 F.... zabbix_agentd
zabbix 771 F.... zabbix_agentd
5:nmap
nmap默认总是会扫描端口,要扫描本机端口,很方便。
root@ubuntu-n1:~# nmap localhost
Starting Nmap 7.60 ( https://nmap.org ) at 2022-05-13 11:23 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000030s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
2049/tcp open nfs
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 1.67 seconds
root@ubuntu-n1:~# nmap -v localhost
Starting Nmap 7.60 ( https://nmap.org ) at 2022-05-13 11:22 CST
Initiating SYN Stealth Scan at 11:22
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 3306/tcp on 127.0.0.1
Discovered open port 80/tcp on 127.0.0.1
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 111/tcp on 127.0.0.1
Discovered open port 2049/tcp on 127.0.0.1
Completed SYN Stealth Scan at 11:22, 1.58s elapsed (1000 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000030s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
2049/tcp open nfs
3306/tcp open mysql
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds
Raw packets sent: 1061 (46.684KB) | Rcvd: 2127 (89.344KB)