lsof命令

    技术2026-01-21  4

    1.语法

        lsof  [options]  filename

    2.说明

    lsof(list open files)是一个列出当前系统打开文件的工具

     

    3.参数说明

        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 -i                      用以显示符合条件的进程情况

       lsof -i[46] [protocol][@hostname|hostaddr][:service|port]            46 --> IPv4 or IPv6            protocol --> TCP or UDP            hostname --> Internet host name            hostaddr --> IPv4地址            service --> /etc/service中的 service name (可以不只一个)            port --> 端口号 (可以不只一个)

    4.输出

    必须以 root 用户的身份运行它才能够充分地发挥其功能。

    COMMAND    PID      USER   FD      TYPE     DEVICE     SIZE       NODE      NAMEinit       1         root  cwd      DIR       3,3       1024       2         /init       1         root  rtd      DIR       3,3       1024       2         /init       1         root  txt      REG       3,3       38432      1763452  /sbin/initinit       1         root  mem      REG       3,3       106114     1091620  /lib/libdl-2.6.so

    每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:

    COMMAND:进程的名称PID:进程标识符USER:进程所有者FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等TYPE:文件类型,如DIR、REG等DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点(文件在磁盘上的标识)NAME:打开文件的确切名称

        其中FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。

    txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。 与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

     

    5.例子

    1、列出当前系统中被所有进程打开的所有文件     lsof | nl     #nl命令打印出行号

    2、下边这几个命令指出打开后面参数文件的进程

        lsof `which httpd`    #那个进程在使用apache的可执行文件    lsof /etc/passwd      #那个进程在占用/etc/passwd

    3、打印出占用httpd可执行文件的进程的进程号(仅仅是进程号,在编写shell脚本是有用)

        lsof -t `which httpd`

    4、显示出那些文件被以cgi打头的进程名的进程打开,以spp打头,和以init打头:

        lsof -c cgi

        lsof -c spp

        lsof -c init

    5、显示出那些文件被以cgi打头的进程打开,但是并不属于用户‘vincent’

        lsof -c cgi -u ^vincent

    6、显示被vincent和apache打开的文件    lsof -u apache,vincent

    7、显示哪些文件被pid为30297的进程打开:    lsof -p 30297

    8、显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列    lsof -D /tmp

    9、显示所有打开的端口     lsof -i

    10、显示所有打开80端口的进程    lsof -i:80

    11、显示所有打开的端口和UNIX domain文件:    lsof -i -U

    12、显示那些进程绑定到了127.0.0.1的UDP8088端口的进程:

        lsof -iUDP@127.0.0.1:808813、列出Internet, x.25 (HP-UX), and UNIX domain 文件:    lsof -i -U

    14、列出指定pid为1234的进程打开的IPv4(i后面参数为4,若IPV6则为6)网络连接:    lsof -i 4 -a -p 1234  注:-a 参数被视为 AND )

    17、获取每个进程的PID,命令名。进程每个文件的文件描述符,文件设备号,文件inode :    lsof –FpcfDi

    18、获取工作目录的第3个字符是'o' or 'O'的进程:    lsof -c /^..o.$/i -a -d cwd  (-a 参数被视为 AND )

    19、获取和指定IP有关的socket 文件:     lsof -i@172.19.148.26

    20、查找监听的socket,可指定ip地址和端口,也可指定传输协议     lsof –i #显示所有打开端口     lsof -i@127.0.0.1 #显示所有绑定地址为127.0.0.1的socket     lsof -iTCP@127.0.0.1:8008 #显示所有绑定127.0.0.1端口为8008的TCP socket

    21、查找指定进程号或进程名使用的文件    lsof -p <PID>

     

    最新回复(0)