zoukankan      html  css  js  c++  java
  • 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 信号
  • 相关阅读:
    Android开发工程师文集-1 小时学会SQLite
    Android开发工程师文集-1 小时学会各种Drawable
    Android开发工程师文集-1 小时学会各种Drawable
    Android精通教程-Android入门简介
    Android精通教程-Android入门简介
    AndroidStudio制作登录和注册功能的实现,界面的布局介绍
    AndroidStudio制作登录和注册功能的实现,界面的布局介绍
    Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率
    Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率
    AndroidStudio项目制作倒计时模块
  • 原文地址:https://www.cnblogs.com/yhjoker/p/13757864.html
Copyright © 2011-2022 走看看