Linux 命令 - lsof

在 UNIX 环境中,文件无处不在,这便产生了一句格言:“任何事物都是文件”。通过文件不仅仅可以访问常规数据,通常还可以访问网络连接和硬件。在有些情况下,当您使用 ls 请求目录清单时,将出现相应的条目。在其他情况下,如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字,不存在相应的目录清单。但是在后台为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,所以能够查看这个列表将是很有帮助的。完成这项任务的实用程序称为 lsof,它对应于“list open files”(列出打开的文件)。

说明

因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

参数

-a 列出打开文件存在的进程

-c<进程名> 列出指定进程所打开的文件

-g 列出GID号进程详情

-d<文件号> 列出占用该文件号的进程

+d<目录> 列出目录下被打开的文件

+D<目录> 递归列出目录下被打开的文件

-n<目录> 列出使用NFS的文件

-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p<进程号> 列出指定进程号所打开的文件

-u 列出UID号进程详情

-h 显示帮助信息

-v 显示版本信息

实例

  1. 无任何参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    root@ubuntu:~# lsof | head
    COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    systemd 1 root cwd DIR 8,2 4096 2 /
    systemd 1 root rtd DIR 8,2 4096 2 /
    systemd 1 root txt REG 8,2 1577232 48501039 /lib/systemd/systemd
    systemd 1 root mem REG 8,2 18976 48497263 /lib/x86_64-linux-gnu/libuuid.so.1.3.0
    systemd 1 root mem REG 8,2 262408 48497138 /lib/x86_64-linux-gnu/libblkid.so.1.1.0
    systemd 1 root mem REG 8,2 14608 48501759 /lib/x86_64-linux-gnu/libdl-2.23.so
    systemd 1 root mem REG 8,2 456632 48497224 /lib/x86_64-linux-gnu/libpcre.so.3.13.2
    systemd 1 root mem REG 8,2 1868984 48501770 /lib/x86_64-linux-gnu/libc-2.23.so
    systemd 1 root mem REG 8,2 138696 48501753 /lib/x86_64-linux-gnu/libpthread-2.23.so

    输出说明:

    COMMAND:进程的名称

    PID:进程标识符

    PPID:父进程标识符(需要指定-R参数)

    USER:进程所有者

    PGID:进程所属组

    FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等

    (1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改

    (2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序

    (3)lnn:library references (AIX);

    (4)er:FD information error (see NAME column);

    (5)jld:jail directory (FreeBSD);

    (6)ltx:shared library text (code and data);

    (7)mxx :hex memory-mapped type number xx.

    (8)m86:DOS Merge mapped file;

    (9)mem:memory-mapped file;

    (10)mmap:memory-mapped device;

    (11)pd:parent directory;

    (12)rtd:root directory;

    (13)tr:kernel trace file (OpenBSD);

    (14)v86 VP/ix mapped file;

    (15)0:表示标准输出

    (16)1:表示标准输入

    (17)2:表示标准错误

    一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等

    (1)u:表示该文件被打开并处于读取/写入模式

    (2)r:表示该文件被打开并处于只读模式

    (3)w:表示该文件被打开并处于

    (4)空格:表示该文件的状态模式为unknow,且没有锁定

    (5)-:表示该文件的状态模式为unknow,且被锁定

    同时在文件状态模式后面,还跟着相关的锁

    (1)N:for a Solaris NFS lock of unknown type;

    (2)r:for read lock on part of the file;

    (3)R:for a read lock on the entire file;

    (4)w:for a write lock on part of the file;(文件的部分写锁)

    (5)W:for a write lock on the entire file;(整个文件的写锁)

    (6)u:for a read and write lock of any length;

    (7)U:for a lock of unknown type;

    (8)x:for an SCO OpenServer Xenix lock on part of the file;

    (9)X:for an SCO OpenServer Xenix lock on the entire file;

    (10)space:if there is no lock.

    TYPE:文件类型,如DIR、REG等,常见的文件类型

    (1)DIR:表示目录

    (2)CHR:表示字符类型

    (3)BLK:块设备类型

    (4)UNIX: UNIX 域套接字

    (5)FIFO:先进先出 (FIFO) 队列

    (6)IPv4:网际协议 (IP) 套接字

    DEVICE:指定磁盘的名称

    SIZE:文件的大小

    NODE:索引节点(文件在磁盘上的标识)

    NAME:打开文件的确切名称

  2. 查看谁正在使用某个文件,也就是说查找某个文件相关的进程

    1
    2
    3
    root@ubuntu:~# lsof /bin/bash
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    bash 21063 root txt REG 8,2 1037528 10490885 /bin/bash
  3. 递归查看某个目录的文件信息

    1
    2
    3
    4
    root@ubuntu:~# lsof +D /home/wwwlogs/ | head -n 3
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    nginx 1578 root 2w REG 8,2 111 14155829 /home/wwwlogs/nginx_error.log
    nginx 1578 root 26w REG 8,2 111 14155829 /home/wwwlogs/nginx_error.log
  4. 列出某个用户打开的文件信息

    1
    2
    3
    4
    root@ubuntu:~# lsof -u www | head -n 3
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    php-fpm 1629 www cwd DIR 8,2 4096 2 /
    php-fpm 1629 www rtd DIR 8,2 4096 2 /
  5. 列出某个程序进程所打开的文件信息

    1
    2
    3
    4
    root@ubuntu:~# lsof -c nginx | head -n 3
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    nginx 1578 root cwd DIR 8,2 4096 2 /
    nginx 1578 root rtd DIR 8,2 4096 2 /
  6. 列出某个用户以及某个进程所打开的文件信息

    1
    2
    3
    4
    root@ubuntu:~# lsof -u www -c nginx | head -n 3
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    nginx 1578 root cwd DIR 8,2 4096 2 /
    nginx 1578 root rtd DIR 8,2 4096 2 /
  7. 列出除了某个用户外的被打开的文件信息

    1
    lsof -u ^root
  8. 通过某个进程号显示该进行打开的文件

    1
    2
    3
    4
    root@ubuntu:~# lsof -p 7471 | head -n 3
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    nginx 7471 www cwd DIR 8,2 4096 2 /
    nginx 7471 www rtd DIR 8,2 4096 2 /
  9. 列出多个进程号对应的文件信息

    1
    lsof -p 74171,7472,7473
  10. 列出除了某个进程号,其他进程号所打开的文件信息

    1
    lsof -p ^74171
  11. 列出所有的网络连接

    1
    2
    3
    4
    5
    6
    root@ubuntu:~# lsof -i | head -n 5
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    sshd 918 root 3u IPv4 16232 0t0 TCP *:ssh (LISTEN)
    sshd 918 root 4u IPv6 16234 0t0 TCP *:ssh (LISTEN)
    redis-ser 1088 redis 4u IPv4 17999 0t0 TCP localhost:6379 (LISTEN)
    nginx 1578 root 14u IPv4 16328 0t0 TCP *:81 (LISTEN)
  12. 列出所有tcp 网络连接信息

    1
    lsof -i tcp
  13. 列出所有udp网络连接信息

    1
    lsof -i udp
  14. 列出谁在使用某个端口

    1
    2
    3
    root@ubuntu:~# lsof -i :3306
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    mysqld 1612 mysql 19u IPv6 18240 0t0 TCP *:mysql (LISTEN)
  15. 列出谁在使用某个特定的udp端口

    1
    lsof -i udp:55
  16. 特定的tcp端口

    1
    lsof -i tcp:80
  17. 列出某个用户的所有活跃的网络端口

    1
    lsof -a -u test -i
  18. 列出所有网络文件系统

    1
    lsof -N
  19. 域名socket文件

    1
    lsof -U
  20. 某个用户组所打开的文件信息

    1
    lsof -g 5555
  21. 根据文件描述列出对应的文件信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    lsof  -d  txt

    # 标准输入
    lsof -d 0
    # 标准输出
    lsof -d 1
    # 标准错误
    lsof -d 2
    lsof -d 0-3
  22. 列出COMMAND列中包含字符串” sshd”,且文件描符的类型为txt的文件信息

    1
    lsof -c sshd -a -d txt
  23. 列出被进程号为 918 的进程所打开的所有 IPV4 的类型文件

    1
    2
    3
    root@ubuntu:~# lsof -i 4 -p 918 -a
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    sshd 918 root 3u IPv4 16232 0t0 TCP *:ssh (LISTEN)

参考

0%