以前在配置项目环境时,经常需要确认某个端口是否开启或被占用,但是对应的命令总是忘,每次都要百度比较麻烦,所以记一下加深印象。
查看端口是否被占用的两种方式
当然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域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。