欢迎您, 来到 宁时修博客.^_^

Linux命令---lsof

2019/07/03 言则行 linux命令 450
lsof 命令使用

一、lsof简介

    lsof 是 list open files 的简称。正如名字所示,它的作用主要是列出系统中打开的文件。

    lsof 可以知道用户和进程操作了哪些文件,也可以查看系统中网络的使用情况,以及设备的信息。

    下载lsof命令:

yum install -y lsof


    lsof的参数也非常多,man page 显示的使用方法如下:

lsof  [  -?abChlnNOPRtUvVX  ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ +|-D D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k ] [ -K k ] [ +|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [+|-r [t[m<fmt>]] ] [ -s [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]


二、lsof输出信息的含义

    在Linux 命令行输入 lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户运行它才能够充分地发挥其功能。

    直接运行 lsof,不使用任何的参数,会列出系统中所有的打开文件,每个文件一行。

$ lsof
COMMAND     PID   TID      USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1            root  cwd       DIR              253,1      4096          2 /
systemd       1            root  rtd       DIR              253,1      4096          2 /
systemd       1            root  txt       REG              253,1   1620416    1053843 /usr/lib/systemd/systemd
systemd       1            root  mem       REG              253,1     20112    1050451 /usr/lib64/libuuid.so.1.3.0
systemd       1            root  mem       REG              253,1    265624    1051898 /usr/lib64/libblkid.so.1.1.0
systemd       1            root  mem       REG              253,1     90248    1050434 /usr/lib64/libz.so.1.2.7
systemd       1            root  mem       REG              253,1    157424    1050447 /usr/lib64/liblzma.so.5.2.2
systemd       1            root  mem       REG              253,1     23968    1050682 /usr/lib64/libcap-ng.so.0.0.0
........................................
java      22461 22529      root  mem       REG              253,1   8737521    1313465 /usr/java/jdk1.8.0_131/jre/lib/ext/jfxrt.jar
java      22461 22529      root  mem       REG              253,1    276808    1313470 /usr/java/jdk1.8.0_131/jre/lib/ext/sunjce_provider.jar
java      22461 22529      root  mem       REG              253,1   3133431    1313521 /usr/java/jdk1.8.0_131/jre/lib/charsets.jar
java      22461 22529      root  mem       REG              253,1   1129600    1313584 /usr/java/jdk1.8.0_131/jre/lib/resources.jar
java      22461 22529      root  mem       REG              253,1   3866653    1313462 /usr/java/jdk1.8.0_131/jre/lib/ext/cldrdata.jar
.......................................
nginx     22774           nginx    0u      CHR                1,3         0t0       1028 /dev/null
nginx     22774           nginx    1u      CHR                1,3         0t0       1028 /dev/null
nginx     22774           nginx    2w      REG              253,1         549     397401 /var/log/nginx/error.log
nginx     22774           nginx    3u     IPv4           52255944         0t0        TCP ebuyhouse-api:8050->183.17.127.227:22601 (ESTABLISHED)
nginx     22774           nginx    6w      REG              253,1         549     397401 /var/log/nginx/error.log
nginx     22774           nginx    7w      REG              253,1           0     397185 /var/log/nginx/access.log
nginx     22774           nginx    8u     IPv4            8890295         0t0        TCP *:8050 (LISTEN)
nginx     22774           nginx    9w      REG              253,1    21172890     918460 /etc/nginx/logs/test_api.log
nginx     22774           nginx   11u     unix 0xffff8800aea11800         0t0   52230615 socket
nginx     22774           nginx   13u     unix 0xffff8800aea13400         0t0   52230617 socket
nginx     22774           nginx   14w      REG              253,1      585554     918465 /etc/nginx/logs/pc_api.log
nginx     22774           nginx   17u     IPv4           52043939         0t0        TCP *:8060 (LISTEN)
nginx     22774           nginx   19u     unix 0xffff8800aea12800         0t0   52230619 socket
nginx     22774           nginx   21u     IPv4           52208772         0t0        TCP *:8070 (LISTEN)
nginx     22774           nginx   27u     unix 0xffff88003632f400         0t0   52230622 socket
nginx     22774           nginx   28u  a_inode                0,9           0       5901 [eventpoll]


    lsof输出各列信息的含义:

    COMMAND:进程的名称

    PID:进程ID,进程标识符

    TID:线程ID,空白TID列表示进程

    USER:进程所有者

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

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

    DEVICE:文件所在的设备

    SIZE/OFF:文件大小或者所在设备的偏移量

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

    NAME:打开的文件名称


    FD:文件描述符编号,或者是以下:

        cwd:当前工作目录

        Lnn:library引用(AIX)

        err:FD信息错误(见 NAME 列)

        jld:监狱目录(FreeBSD)

        ltx:共享 library文件(代码和数据)

        Mxx:十六进制内存映射类型号 xx

        m86:DOS合并映射文件

        mem:内存映射文件

        mmap:内存映射设备

        pd:父目录

        rtd:根目录

        tr:内核跟踪文件(OpenBSD)

        txt:程序文本(代码和数据)

        v86:VP/ix 映射文件

        

        数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行 [eventpoll] ,其文件描述符为 28。

        该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,0,1,2,分别表示标准输入、标准输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。

        


        FD后面跟着这些字符中的一个,描述文件打开的模式:

        r:文件被打开并处于只读模式

        w:文件被打开并处于写入模式

        u:文件被打开并处于读取和写入模式

        space(空格) :文件状态模式未知(unknown),且没有锁定

        - :文件状态模式未知(unknown),且被锁定


        文件状态模式字符后面跟着一个锁字符,描述应用于文件的锁的类型:

        N:表示未知类型的 Solaris NFS锁

        r:表示文件的一部分的读锁

        R:表示整个文件的读锁

        w:表示文件的一部分的写锁

        W:表示整个文件的写锁

        u:表示任何长度的读写锁

        U:表示未知类型的锁

        x:表示文件的一部分的SCO OpenServer Xenix锁

        X:表示整个文件的SCO OpenServer Xenix锁

        space(空格):没有锁



    TYPE:文件类型,例如: GDIR, GREG, VDIR, VREG等,或者如下:

        IPv4:IPv4 socket

        IPv6:用于打开的IPv6网络文件 - 即使其地址是ipv4,也映射到ipv6地址中

        inet:Internet domain socket

        sock:未知的 domain socket

        unix:UNIX domain socket

        BLK:块设备

        CHR:字符文件

        DEL: 已删除的Linux映射文件

        DIR:文件夹(目录)

        FIFO:先进先出 (FIFO) 队列

        LINK:符号链接(软连接)文件

        REG:常规文件

        SMT:共享内存传输文件

        UNNM:未命名的文件类型

        更多类型请 man lsof。


三、使用示例

    1、查看文件和进程信息

    lsof  filename:列出某个文件被哪些进程使用

$ lsof /var/log/nginx/error.log
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
nginx    3268  root    2w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx    3268  root    6w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22771 nginx    2w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22771 nginx    6w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22772 nginx    2w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22772 nginx    6w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22773 nginx    2w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22773 nginx    6w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22774 nginx    2w   REG  253,1      549 397401 /var/log/nginx/error.log
nginx   22774 nginx    6w   REG  253,1      549 397401 /var/log/nginx/error.log


    lsof -c command/process:列出某个命令/进程使用的文件信息

$ lsof -c lsof
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
lsof    25021 root  cwd    DIR  253,1      4096   131073 /root
lsof    25021 root  rtd    DIR  253,1      4096        2 /
lsof    25021 root  txt    REG  253,1    154184  1058538 /usr/sbin/lsof
lsof    25021 root  mem    REG  253,1 106070960  1050292 /usr/lib/locale/locale-archive
lsof    25021 root  mem    REG  253,1    144792  1050015 /usr/lib64/libpthread-2.17.so
lsof    25021 root  mem    REG  253,1     19776  1049995 /usr/lib64/libdl-2.17.so
lsof    25021 root  mem    REG  253,1    402384  1050423 /usr/lib64/libpcre.so.1.2.0
lsof    25021 root  mem    REG  253,1   2127336  1049989 /usr/lib64/libc-2.17.so
lsof    25021 root  mem    REG  253,1    155744  1050432 /usr/lib64/libselinux.so.1
lsof    25021 root  mem    REG  253,1    164264  1049982 /usr/lib64/ld-2.17.so

    -c 参数后面跟着命令的开头字符串,不一定是具体的程序名称,比如 lsof -c n 也是合法的,会列出所有名字开头字母是 n 的程序打开的文件信息。

    这个命令虽然没有 -p 查看某个进程更直接,但是对于不能直接查到进程号,或者程序包含多个进程的场景还是有用的。



    lsof -p PID:列出某个进程打开的所有文件

$ lsof -p 11098
COMMAND   PID USER   FD      TYPE             DEVICE  SIZE/OFF     NODE NAME
java    11098 root  cwd       DIR              253,1      4096        2 /
java    11098 root  rtd       DIR              253,1      4096        2 /
java    11098 root  txt       REG              253,1      7734  1313190 /usr/java/jdk1.8.0_131/jre/bin/java
java    11098 root  mem       REG              253,1    256766  1313264 /usr/java/jdk1.8.0_131/jre/lib/amd64/libsunec.so
java    11098 root  mem       REG              253,1     93112  1313254 /usr/java/jdk1.8.0_131/jre/lib/amd64/libnio.so
java    11098 root  mem       REG              253,1     50289  1313251 /usr/java/jdk1.8.0_131/jre/lib/amd64/libmanagement.so
java    11098 root  mem       REG              253,1     68192  1050559 /usr/lib64/libbz2.so.1.0.6
java    11098 root  mem       REG              253,1    157424  1050447 /usr/lib64/liblzma.so.5.2.2


    lsof -u user:列出某个用户打开的文件

$ lsof -u nginx
COMMAND   PID  USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
nginx   22771 nginx  cwd       DIR              253,1     4096        2 /
nginx   22771 nginx  rtd       DIR              253,1     4096        2 /
nginx   22771 nginx  txt       REG              253,1  1132976  1058689 /usr/sbin/nginx
nginx   22771 nginx  mem       REG              253,1    27616  1319192 /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so
nginx   22771 nginx  mem       REG              253,1   161000  1319186 /usr/lib64/nginx/modules/ngx_stream_module.so
nginx   22771 nginx  mem       REG              253,1   101296  1319188 /usr/lib64/nginx/modules/ngx_mail_module.so
nginx   22771 nginx  mem       REG              253,1    19384  1050650 /usr/lib64/libgpg-error.so.0.10.0
nginx   22771 nginx  mem       REG              253,1   535064  1050690 /usr/lib64/libgcrypt.so.11.8.2

    也可以取反,列出所有不是某个用户打开的文件,只要在用户名之前加上 ^ 符号:

$ lsof -u ^nginx

    

    lsof +d dir:列出访问某个目录的所有进程

$ lsof +d /etc/nginx/logs
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
nginx    3268  root    9w   REG  253,1 21255643 918460 /etc/nginx/logs/test_api.log
nginx    3268  root   14w   REG  253,1   585554 918465 /etc/nginx/logs/pc_api.log
nginx   22771 nginx    9w   REG  253,1 21255643 918460 /etc/nginx/logs/test_api.log
nginx   22771 nginx   14w   REG  253,1   585554 918465 /etc/nginx/logs/pc_api.log
nginx   22772 nginx    9w   REG  253,1 21255643 918460 /etc/nginx/logs/test_api.log
nginx   22772 nginx   14w   REG  253,1   585554 918465 /etc/nginx/logs/pc_api.log
nginx   22773 nginx    9w   REG  253,1 21255643 918460 /etc/nginx/logs/test_api.log
nginx   22773 nginx   14w   REG  253,1   585554 918465 /etc/nginx/logs/pc_api.log
nginx   22774 nginx    9w   REG  253,1 21255643 918460 /etc/nginx/logs/test_api.log
nginx   22774 nginx   14w   REG  253,1   585554 918465 /etc/nginx/logs/pc_api.log

    +d 并不会递归地去访问子目录,如果想,可以使用 +D:

$ lsof +D /usr/local/
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
aliyun-se 1603 root  txt    REG              253,1  5078936  1310724 /usr/local/share/aliyun-assist/1.0.1.259/aliyun-service
aliyun-se 1603 root    3w   REG              253,1   962061  1310730 /usr/local/share/aliyun-assist/1.0.1.259/log/aliyun_assist_main.log
AliYunDun 7394 root  cwd    DIR              253,1     4096  1058397 /usr/local/aegis/aegis_update
AliYunDun 7394 root  txt    REG              253,1  3149552  1052379 /usr/local/aegis/aegis_update/AliYunDunUpdate
AliYunDun 7394 root    3u   REG              253,1        0  1058410 /usr/local/aegis/aegis_update/aegis_singleapp_update
AliYunDun 7426 root  cwd    DIR              253,1     4096  1319434 /usr/local/aegis/aegis_client/aegis_10_65
AliYunDun 7426 root  txt    REG              253,1  2831088  1319437 /usr/local/aegis/aegis_client/aegis_10_65/AliYunDun



    2、查看网络信息

    lsof -i :列出所有的网络连接信息

$ lsof -i
COMMAND     PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
dhclient    748      root    6u  IPv4    14367      0t0  UDP *:bootpc 
dhclient    748      root   20u  IPv4    11901      0t0  UDP *:31527 
dhclient    748      root   21u  IPv6    11902      0t0  UDP *:31152 
ntpd        850       ntp   16u  IPv4    14009      0t0  UDP *:ntp 
ntpd        850       ntp   17u  IPv6    14010      0t0  UDP *:ntp 
ntpd        850       ntp   18u  IPv4    14015      0t0  UDP localhost:ntp 
ntpd        850       ntp   19u  IPv4    14016      0t0  UDP ebuyhouse-api:ntp 
nginx      3268      root    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx      3268      root   17u  IPv4 52043939      0t0  TCP *:8060 (LISTEN)
nginx      3268      root   21u  IPv4 52208772      0t0  TCP *:8070 (LISTEN)


    lsof -i TCP/UDP:只显示 TCP 或者 UDP 连接

    -i 后面直接跟着协议的类型(TCP 或者 UDP)就能只显示该网络协议的连接信息:

$ lsof -i TCP
COMMAND     PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx      3268      root    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx      3268      root   17u  IPv4 52043939      0t0  TCP *:8060 (LISTEN)
nginx      3268      root   21u  IPv4 52208772      0t0  TCP *:8070 (LISTEN)
AliYunDun  7426      root   15u  IPv4 48695898      0t0  TCP ebuyhouse-api:35864->100.100.30.26:http (ESTABLISHED)
java      11098      root   17u  IPv4 52262767      0t0  TCP ebuyhouse-api:58784->47.106.140.94:9004 (CLOSE_WAIT)
java      11098      root   19u  IPv4 52264208      0t0  TCP ebuyhouse-api:43790->172.18.148.121:8761 (ESTABLISHED)


    lsof -i :80    :查看某个端口的网络连接情况

    一般要运行服务的时候发现网络冲突,或者需要了解某个端口被哪个进程使用的时候非常方便:

$ lsof -i :80
COMMAND    PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
AliYunDun 7426 root   15u  IPv4 48695898      0t0  TCP ebuyhouse-api:35864->100.100.30.26:http (ESTABLISHED)


    lsof -i @172.16.1.11 :查看连接到某个主机的网络情况

$ lsof -i @183.17.127.227
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    20483      root    3u  IPv4 52200320      0t0  TCP ebuyhouse-api:ssh->183.17.127.227:25533 (ESTABLISHED)
sshd    20485 ebuyhouse    3u  IPv4 52200320      0t0  TCP ebuyhouse-api:ssh->183.17.127.227:25533 (ESTABLISHED)
nginx   22774     nginx    4u  IPv4 52262906      0t0  TCP ebuyhouse-api:8050->183.17.127.227:23222 (ESTABLISHED)
nginx   22774     nginx    5u  IPv4 52265875      0t0  TCP ebuyhouse-api:8050->183.17.127.227:23095 (ESTABLISHED)

    端口和主机还可以放在一起使用,表示连接到某个主机特定端口的网络情况:

$ lsof -i @183.17.127.227:25533
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    20483      root    3u  IPv4 52200320      0t0  TCP ebuyhouse-api:ssh->183.17.127.227:25533 (ESTABLISHED)
sshd    20485 ebuyhouse    3u  IPv4 52200320      0t0  TCP ebuyhouse-api:ssh->183.17.127.227:25533 (ESTABLISHED)

    

    lsof -i -s TCP:LISTEN  : 列出当前机器监听的端口

$ lsof -i -s TCP:LISTEN
COMMAND    PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx     3268     root    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx     3268     root   17u  IPv4 52043939      0t0  TCP *:8060 (LISTEN)
nginx     3268     root   21u  IPv4 52208772      0t0  TCP *:8070 (LISTEN)
java     11098     root   23u  IPv4 48974710      0t0  TCP *:ampify (LISTEN)
java     14493     root   46u  IPv4 51687304      0t0  TCP *:8983 (LISTEN)
java     14493     root   51u  IPv4 51687308      0t0  TCP *:8017 (LISTEN)
java     14493     root  165u  IPv4 51686189      0t0  TCP localhost:gadugadu (LISTEN)
beam.smp 14885 rabbitmq   45u  IPv4 21403236      0t0  TCP *:25672 (LISTEN)
beam.smp 14885 rabbitmq   66u  IPv6 21402240      0t0  TCP *:amqp (LISTEN)
beam.smp 14885 rabbitmq   70u  IPv4 21403278      0t0  TCP *:15672 (LISTEN)

    -s p:s 参数跟着两个字段:协议和状态,中间用冒号隔开。比如这里 TCP:LISTEN 表示处于监听状态的 TCP 协议,类似的,你也可以查看处于已连接的 TCP 网络:

$ lsof -i -s TCP:ESTABLISHED
COMMAND     PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
AliYunDun  7426      root   15u  IPv4 48695898      0t0  TCP ebuyhouse-api:35864->100.100.30.26:http (ESTABLISHED)
java      11098      root   19u  IPv4 52264208      0t0  TCP ebuyhouse-api:43790->172.18.148.121:8761 (ESTABLISHED)
beam.smp  14885  rabbitmq   13u  IPv6 52001151      0t0  TCP ebuyhouse-api:amqp->47.106.140.94:52284 (ESTABLISHED)
beam.smp  14885  rabbitmq   17u  IPv6 52248358      0t0  TCP ebuyhouse-api:amqp->47.106.140.94:14449 (ESTABLISHED)


    

    组合用法

    lsof 的过滤参数是可以组合起来的,但是默认情况下是 OR 逻辑,也就是会列出所有过滤条件的总和。可以使用 -a 参数告诉 lsof 列出同时满足所有条件的结果,比如:


    列出某个进程监听的所有网络连接:

$ lsof -a -p 14493 -i -s TCP:LISTEN
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    14493 root   46u  IPv4 51687304      0t0  TCP *:8983 (LISTEN)
java    14493 root   51u  IPv4 51687308      0t0  TCP *:8017 (LISTEN)
java    14493 root  165u  IPv4 51686189      0t0  TCP localhost:gadugadu (LISTEN)


    列出某个用户的所有活跃的网络端口:

$ lsof -a -u nginx -i
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx   22771 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22771 nginx   17u  IPv4 52043939      0t0  TCP *:8060 (LISTEN)
nginx   22771 nginx   21u  IPv4 52208772      0t0  TCP *:8070 (LISTEN)
nginx   22772 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22772 nginx   17u  IPv4 52043939      0t0  TCP *:8060 (LISTEN)
nginx   22772 nginx   21u  IPv4 52208772      0t0  TCP *:8070 (LISTEN)


    列出某个端口相关的信息,然后每隔3秒重复列出:

$ lsof -a -i :8050 -r 3
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx    3268  root    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22771 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22772 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22773 nginx    5u  IPv4 52264919      0t0  TCP ebuyhouse-api:8050->183.17.127.227:22549 (ESTABLISHED)
nginx   22773 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22774 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
=======
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx    3268  root    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22771 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22772 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22773 nginx    5u  IPv4 52264919      0t0  TCP ebuyhouse-api:8050->183.17.127.227:22549 (ESTABLISHED)
nginx   22773 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
nginx   22774 nginx    8u  IPv4  8890295      0t0  TCP *:8050 (LISTEN)
=======

    -r :将lsof置于重复模式。延迟 t 秒(默认值为15秒),然后重复列出。



点赞
说说你的看法

所有评论: (5)