查看端口是否已监听(被占用)的3种方法

查看端口是否已监听(被占用)的3种方法

方法一:使用netstat

netstatnetwork statistics的意思,network是网络的意思,这个应该谁都知道,而statistics是统计数据的意思,所以netstat这个命令的意思就是用于显示网络接口的统计数据信息。

安装netstat

一般最小化安装的Linux(比较VPS)可能没有netstat这个命令,这时我们就要安装,但安装包却不叫netstat,而是叫net-tools

对于centos系统(或者centos8里把yum改为dnf,DNF stands for Dandified yum)

yum -y install net-tools

对于debian系列(debian,ubuntu等等),个人猜测是这么安装(未实践过)

apt install net-tools

其它系统就自己查怎么安装吧。

使用netstat查看端口

比如nginx启动后,假设你监听的是443(https默认端口),你想确定端口是否已被正常监听

# Linux
netstat -tulnp | grep 443

# Windows
netstat -ano | findstr 443

以下选项为Linux选项,Windows选项几乎与Linux选项完全不同,一般用-ano即可。

-t = --tcp 显示tcp的端口
-u = --udp 显示udp的端口(tcp和udp是不同的协议,它们端口相同并不会冲突)
-l = --listening 显示处于监听状态的连接(即状态为LISTENING的连接,否则会显示已建立的连接,状态为ESTABLISHED)
-n = --numeric 显示数字地址(ip用数字显示,否则会显示域名,主机名等,就比如127.0.0.1,如果没有-n它就不会显示成127.0.0.1,可以自己试试)
-p = --program 显示程序PID及名称
-a = --all 相当于设置了前面所有选项(并且还不止,因为我这里没有列出它的全部选项)

更多Linux选项请自行man netstat查看,Windows请使用netstat --help(当然这个Linux也能用)。

值得注意的是,Mac没有netstat命令,也就是说macOS上要查看端口占用情况,是不能用netstat这个命令的(可用lsof -i:443查看,下边会说到)。

方法二:使用ss

据我查询资料,ss应该是socket statistics的意思,中文可以叫“socket统计数据”。

而什么是socket?socket其实就是接口,比如电脑里的网卡(是电脑与互联网数据交互的接口),又比如“Unix domain socket”就是通过.sock文件来通信(同一主机可以用这种方法,它比走127.0.0.1虚拟环回网卡速度快)。

比如配置nginx+php-fpm,一般会有这一段:

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
}

它的意思是,当遇到php文件时,使用fastcgi_pass指令把它转交给php-fpm来处理,这里是用“ip+端口”的方式来指定php-fpm的,其实我们也可以用“Unix domain socket”来指定

location ~ \.php$ {
    fastcgi_pass unix:/path/to/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
}

但这要求php-fpm那边监听一个sock文件而不是监听网卡端口,在php-fpm.conf的[www]模块里listen要指向本地的一个sock文件

[www]
; 监听sock文件
listen = /dev/shm/php-cgi.sock

; 监听本地环回网卡的9000端口
; listen = 127.0.0.1:9000

该文件是什么后缀都可以,只不过为了让我们人方便知道它是什么,所以用了.sock作为后缀,另外文件本身是不存在的,启动php-fpm的时候它会自动生成。

使用ss

据我ss貌似最小化安装的系统都自带,所以就不需要安装了。据我所知,ss命令输出的信息比较多,没有netstat输出信息那么纯粹,个人不太喜欢用这个命令,如果需要详细查看信息的,可以用它。

使用方法

ss -lnp | grep 443

# 加个column -t可以让它显示的更紧凑一点(-t表示以table形式显示)
ss -lnp | grep 443 | column -t

其它用法请自行查看帮助,对了macOS也没有这个命令。

方法三:使用lsof

macOS唯一能用的查看端口占用信息的命令,并且macOS默认自带lsof命令,但Linux也可以安装使用,Windows没了解过。

lsof 的ls是list,o是open,f是files,即list open files的意思,显示的信息会更加详细。

安装lsof

这个命令Linux默认没有,需要安装(centos,其它系统请自行用对应的包管理软件安装)

yum -y install lsof

使用lsof

一般情况下都是用-i指定要查看的端口

lsof -i:443

但这样会比较慢,因为它会自动转换端口为端口名和转换ip为域名/主机名。

使用以下方式可以快一点

lsof -n -P -i:443

-P (注意是在大写P) P是port的首字母,跟端口相关,但这里并不是指定端口,而是指“不把端口转成端口名”(其实我不太明白这个,因为端口貌一般似没有端口名)。
-n 显示数字ip地址(即阻止它转换成域名/主机名)
-i 个人认为是Internet的首字母,后面用冒号分隔,可跟端口号或ip。

不推荐在linux上使用lsof这个命令来查端口。

打赏

Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

查看端口是否已监听(被占用)的3种方法