当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Linux lsof命令使用详解

    栏目:Linux/apache问题 时间:2020-01-11 22:25

    lsof(list open files)是一个查看进程打开的文件的工具。

    在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。

    常用选项

    -a 指示其它选项之间为与的关系
    -c <进程名> 输出指定进程所打开的文件
    -d <文件描述符> 列出占用该文件号的进程
    +d <目录> 输出目录及目录下被打开的文件和目录(不递归)
    +D <目录> 递归输出及目录下被打开的文件和目录
    -i <条件> 输出符合条件与网络相关的文件
    -n 不解析主机名
    -p <进程号> 输出指定 PID 的进程所打开的文件
    -P 不解析端口号
    -t 只输出 PID
    -u 输出指定用户打开的文件
    -U 输出打开的 UNIX domain socket 文件
    -h 显示帮助信息
    -v 显示版本信息

    基本输出

    如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。我们先让 lsof 命令输出当前 Bash 进程打开的文件,并截取其中的一部分结果来介绍输出内容中都包含哪些信息:

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

    下面简单介绍一下 FD 列和 TYPE 列中的常见内容。
    FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件:

    还有一部分 FD 是以数字表示的,比如标准输入输出文件:

    数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:

    TYPE 列中常见的 REG 和 DIR 分别表示普通文件和目录。而 CHR 和 BLK 则分别表示字符和块设备,unix、fifo 和 IPv4/IPv6 分别表示 UNIX domain 套接字、先进先出(FIFO)队列和 IPv4/IPv6 套接字。

    下面我们来介绍一些 lsof 命令的常见用法。

    查看哪些进程打开了某个文件

    直接指定文件的名称作为 lsof 的参加就可以查看哪些进程打开了这个文件,下面的命令查询打开了 /bin/bash 文件的进程:

    $ sudo lsof /bin/bash

    除了普通文件,也可以是设备等文件(下面命令的输出很长,图示只是截取的一小部分):

    $ sudo lsof /dev/sda1

    查看哪些进程打开了某个目录及目录下的文件