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)