Linux 环境使用 lsof 命令查询端口占用
最近发现一个 Linux 环境中比较有用的查看系统网络连接的命令 lsof ,这里记录下 lsof 命令的网络连接查询功能(其主要原理是通过查询与网络连接相关的文件信息来获取连接信息)。本文主要内容来自 lsof 命令的 manpage。
lsof 命令
lsof 命令的 -i 参数用于指定进行查询的网络连接的参数,其形式如下所示。
lsof -i [46][protocol][@hostname|hostaddr][:service|port] //losf 命令查看网络连接的使用格式
注意上述参数均为可选参数,其中各个参数的具体解释如下所示:
46 //4 和 6 分别用于指定进行查询的 IP 地址的版本,即 -i4 使用 IPv4 进行查询,而 -i6 使用 IPv6 进行查询,不指定上述参数时,则对所有支持的 IP 地址进行查询。 protocol //协议,用于指定进行查询的网络连接所使用的协议,即 TCP 或 UDP hostname //主机名,用于指定查询所有与 hostname 对应网络主机名相关的网络连接 hostaddr //主机地址,通过 IP 地址形式给出的进行查询的地址信息,该地址信息应与前面指定的 IP 版本对应 service //服务,用于指定查询网络连接所支持的服务, /etc/services 文件中记录所有有效的服务名 port //端口,指定查询的连接所使用的端口
以上参数中,再指定 hostname 或 hostaddr 时必须加上 \'@\',而指定 service 和 port 时则必须加上 \':\' .用户可以指定多个 service 和 port,只需通过 \',\' 进行隔开,同时也可以通过 \'-\' 指定端口号范围,如指定 1000 到 2000 端口号即为 "1000-2000". 通过执行 lsof 命令,用户可以查询获得使用某个特定服务/端口/地址的网络连接的信息,包括其 PID 进程号,其执行的具体命令和使用的协议等。
下面通过使用实例来说明 lsof 命令的使用方式,记住与网络相关的参数需要通过 -i 参数进行指定。
1.查询特定端口如 5090 端口是否被占用( 即查看当前是否有连接使用 5090 端口 )
lsof -i:5090 //查看 5090 端口的连接情况
2.查看与 127.0.0.1 相关的 tcp 连接情况
lsof -i tcp@127.0.0.1 //显示与 127.0.0.1 相关的 tcp 连接的情况
3.查看系统上 https 服务的连接情况
lsof -i :https //显示 https 服务相关的连接
实际上,lsof 命令的功能远不止于查询网络连接。该命令的在 man lsof 中的解释为列举打开的文件( list open files ).由于 Linux 环境中普通文件( regular file ),流( stream ) 和网络文件( 包括套接字(socket), 网络文件系统(NFS)等)均以文件的形式处理,故而 lsof 可以实现相当强大的查询功能。上面对 lsof 命令对网络连接的查询即主要基于对网络文件的查询来完成。
这里通过命令实例的形式介绍下 lsof 的简单用法。更多的细节可以参考 lsof 的 manpage,通过命令行命令 man lsof 查看。
1.使用 -c string 参数指定列举以 string 作为开始字符的命令所对应的文件的信息。下列命令即列举所有以字符 b 作为开始字符的命令所对应的信息。用户可以看到系统上存在多个运行 bash 命令的进程。
lsof -c b //列举所有执行以字符 k 开头的命令( command ) 进程
2.使用 -u user 参数指定列举所有用户名为 test 或者 root 的相关进程。
lsof -u test,root //列举所有与用户 test 相关的文件信息
3.在默认情况下,lsof 命令的各个参数之间的关系为 或(OR) 运算,也就是说同时指定 -u 和 -c 命令,则 lsof 会返回符合 -u 或 -c 参数的所有结果。用户可以通过 -a 参数指定所有的参数使用 与(AND)运行,即同时指定 -a 参数后,lsof 只会返回同时符合所有参数要求的结果。
lsof -a -u root -i @127.0.0.1 //列举所有属于 root 用户的与 127.0.0.1 相关的连接
其他
笔者主要通过 lsof 命令来查询某个特定的端口是否正在被占用,并通过 kill 命令终止当前占用特定端口的进程。kill 命令的功能为向某个进程发送一个信号( signal ),所有可选的信号编号可通过 kill -L 进行查看。想要通过 kill 命令终止某个进程,只需向该进程发送 SIGKILL 信号,该信号的编号为 9,故而可以通过 kill -9 pid 的命令终止 pid 所对应的进程。
kill -L //输出 kill 命令所支持的所有的信号 kill -9 12345 //终止进程 12345,实际为向进程 12345 发送 SIGKILL 信号