Linux 下查看端口是否被占用

2,603 阅读6分钟

以前在配置项目环境时,经常需要确认某个端口是否开启或被占用,但是对应的命令总是忘,每次都要百度比较麻烦,所以记一下加深印象。

查看端口是否被占用的两种方式

当然linux 查看端口是否被占用的方式不止两种,这里说一下最常用的两种

一、lsof -i:端口

$ lsof -i:6379
COMMAND    PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
redis-ser 9426 wentong    6u  IPv6 0xe92237cea15f9491      0t0  TCP *:6379 (LISTEN)
redis-ser 9426 wentong    7u  IPv4 0xe92237ce94e02489      0t0  TCP *:6379 (LISTEN)

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

百度百科讲的很清楚了,Linux 下所有事物都以文件的形式存在,losf 可以通过查看网络连接来判断端口是否被占用。 lsof -i 用以显示符合条件的进程情况

lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

我们可以通过协议、@hostname、hostaddr、:service|port 来查看对应的文件。

比如查看tcp

$ lsof -i tcp
COMMAND    PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
rapportd  1074 wentong    4u  IPv4 0xe92237ce94e02e51      0t0  TCP *:49574 (LISTEN)
rapportd  1074 wentong    5u  IPv6 0xe92237ce94bb6ab1      0t0  TCP *:49574 (LISTEN)
rapportd  1074 wentong   13u  IPv4 0xe92237cea20baf39      0t0  TCP 172.20.10.2:49574->172.20.10.1:50836 (ESTABLISHED)
rapportd  1074 wentong   14u  IPv4 0xe92237ce9b9db819      0t0  TCP 172.20.10.2:49574->172.20.10.8:53703 (ESTABLISHED)

查看服务

[root@iZwz9hmb50uzud432t180uZ ~]# lsof -i:redis
COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 29410 redis    6u  IPv4 439649      0t0  TCP *:redis (LISTEN)

其他常用的参数列表:

lsof filename 显示打开指定文件的所有进程 lsof -a 表示两个参数都必须满足时才显示结果 lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件 lsof -u username 显示所属user进程打开的文件 lsof -g gid 显示归属gid的进程情况 lsof +d /DIR/ 显示目录下被进程打开的文件 lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长 lsof -d FD 显示指定文件描述符的进程 lsof -n 不将IP转换为hostname,缺省是不加上-n参数 在lsof 中各列信息的意思分别为:

各列展示信息解释:

COMMAND:进程的名称 PID:进程标识符 USER:进程所有者 FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称

二、netstart

[root@iZwz9hmb50uzud432t180uZ ~]# netstat -anp | grep 80
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      18335/java
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      31220/nginx: master
tcp        0      0 192.168.1.51:56792      100.100.30.25:80        ESTABLISHED 1105/AliYunDun
tcp6       0      0 :::80                   :::*                    LISTEN      31220/nginx: master

通过netstat -anp | grep 80 我们可以看出nginx 监听了80 端口,LISTEN 和LISTENING 要区别开。 常见的连接状态有:

LISTEN 侦听来自远方的TCP端口的连接请求 SYN-SENT 在发送连接请求后等待匹配的连接请求 SYN-RECEIVED 在收到和发送一个连接请求后等待对方对连接请求的确认 ESTABLISHED 代表一个打开的连接 FIN-WAIT-1 等待远程TCP连接中断请求,或先前的连接中断请求的确认 FIN-WAIT-2 从远程TCP等待连接中断请求 CLOSE-WAIT 等待从本地用户发来的连接中断请求 CLOSING 等待远程TCP对连接中断的确认 LAST-ACK 等待原来的发向远程TCP的连接中断请求的确认 TIME-WAIT 等待足够的时间以确保远程TCP接收到连接中断请求的确认 CLOSED 没有任何连接状态

Netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。 Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

netstat 主要是监听网络的工具,它的常用参数:

-a 显示所有socket,包括正在监听的。   -n 以网络IP地址代替名称,显示出网络连接情形。   -p 显示建立相关连接的程序名和PID。   -c 每隔1秒就重新显示一遍,直到用户中断它。   -i 显示所有网络接口的信息,格式“netstat -i”。   -r显示核心路由表,格式同“route -e”。   -t 显示TCP协议的连接情况   -u 显示UDP协议的连接情况。   -v 显示正在进行的工作。   -b 显示在创建每个连接或侦听端口时涉及的可执行程序。   -e 显示以太网统计。此选项可以与 -s 选项结合使用。   -f 显示外部地址的完全限定域名(FQDN)。   -o显示与与网络计时器相关的信息。 -s 显示每个协议的统计。   -x 显示 NetworkDirect 连接、侦听器和共享端点。   -y 显示所有连接的 TCP 连接模板。无法与其他选项结合使用。

我们上面用的netstat -anp 就是参数a,n,p 的集合如果单独使用netstat:

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:48543   ESTABLISHED
tcp        0      0 iZwz9hmb50uzud432:56792 100.100.30.25:http      ESTABLISHED
tcp        0      0 iZwz9hmb50uzud:webcache 85.119.151.254:35415    FIN_WAIT2
tcp        0      0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:55488   ESTABLISHED
tcp        0     36 iZwz9hmb50uzud432t1:ssh 223.104.250.148:40173   ESTABLISHED
tcp        0      0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:40997   ESTABLISHED
tcp        0      0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:37248   ESTABLISHED
tcp        0      0 iZwz9hmb50uzud:webcache 85.119.151.251:37467    FIN_WAIT2
tcp        0      0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:54500   ESTABLISHED
tcp        0      0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:62286   ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    462645   /run/user/0/systemd/notify
unix  4      [ ]         DGRAM                    10900    /run/systemd/notify
unix  2      [ ]         DGRAM                    10902    /run/systemd/cgroups-agent
unix  6      [ ]         DGRAM                    10917    /run/systemd/journal/socket
unix  16     [ ]         DGRAM                    10935    /run/systemd/journal/dev-log
unix  2      [ ]         DGRAM                    269257   /var/run/chrony/chronyd.sock
unix  3      [ ]         STREAM     CONNECTED     448234
unix  2      [ ]         DGRAM                    22252
unix  2      [ ]         STREAM     CONNECTED     854514
unix  3      [ ]         DGRAM                    462647
unix  3      [ ]         STREAM     CONNECTED     357348
unix  2      [ ]         STREAM     CONNECTED     857773
unix  3      [ ]         STREAM     CONNECTED     270110
...

可以看出netstat 展示的信息分为两部分:

Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指的是接收队列和发送队列,这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积,这种情况非常少见。 另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。