Linux 环境使用 lsof 命令查询端口占用 - yhjoker

时间:2024-03-08 19:54:05

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 信号