一、命令介绍

  lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,如TCP和UDP等。系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

参数 含义
-c 列出指定进程打开的文件
-a 进行与运算
-d 列出为某文件描述符的文件
+d 列出目录下被打开的文件
+D 递归列出目录下被打开的文件
-n 列出使用NFS的文件
-i 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p 列出指定进程号所打开的文件
-g 列出归属gid的进程详情
-u 列出归属uid的进程详情
-t 仅显示进程号
-n 不做名字解析


二、输出信息含义

[root@server ~]# lsof
COMMAND    PID  TID     USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1          root  cwd       DIR              253,0      4096        128 /
systemd      1          root  rtd       DIR              253,0      4096        128 /
systemd      1          root  txt       REG              253,0   1523624  201648993 /usr/lib/systemd/systemd
systemd      1          root  mem       REG              253,0     20032  134327260 /usr/lib64/libuuid.so.1.3.0
systemd      1          root  mem       REG              253,0    252704  134328361 /usr/lib64/libblkid.so.1.1.0
systemd      1          root  mem       REG              253,0     90632  134327251 /usr/lib64/libz.so.1.2.7
systemd      1          root  mem       REG              253,0    153192  134741572 /usr/lib64/liblzma.so.5.0.99
systemd      1          root  mem       REG              253,0     19888  134327335 /usr/lib64/libattr.so.1.1.0
systemd      1          root    0u      CHR                1,3       0t0       1028 /dev/null
systemd      1          root    1u      CHR                1,3       0t0       1028 /dev/null
systemd      1          root    2u      CHR                1,3       0t0       1028 /dev/null
systemd      1          root    3u  a_inode                0,9         0       6835 [timerfd]
systemd      1          root    4u  a_inode                0,9         0       6835 [eventpoll]
systemd      1          root    5u  a_inode                0,9         0       6835 [signalfd]
systemd      1          root    6r      DIR               0,21         0       8681 /sys/fs/cgroup/systemd
systemd      1          root    7u  a_inode                0,9         0       6835 [timerfd]
systemd      1          root    8u  netlink                          0t0      10099 KOBJECT_UEVENT
systemd      1          root    9r      REG                0,3         0       8914 /proc/1/mountinfo
systemd      1          root   10r  a_inode                0,9         0       6835 inotify
dockerd-c 1540 1988     root  mem       REG              253,0    164432  134317357 /usr/lib64/ld-2.17.so
dockerd-c 1540 1988     root  mem-W     REG              253,0     32768  135461345 /var/lib/docker/volumes/metadata.db
dockerd-c 1540 1988     root  mem       REG              253,0     83208  135478261 /usr/lib64/libudev.so.1.6.2
COMMAND: 进程的名称
    PID: 进程标识符
    USER:进程所有者
    FD:文件描述符,应用程序通过文件描述符识别该文件。这里列举几个
           •  cwd   表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
           •  txt   该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /usr/lib/systemd/systemd
           •  rtd   根目录
           •  mem   内存映射文件
           •  0     标准输出
           •  1     标准输入
           •  2     标准错误
       注:数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数,如上的/proc/1/mountinfo,其文件描述符为9。
           而一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u。u 表示该文件被打开并处于读取/写入模式,r表示只读,w表示只写。
           该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。
           所以大多数应用程序所打开的文件的 FD 都是从 3 开始 ,同时还有大写 的W 表示该应用程序具有对整个文件的写锁   

    TYPE:文件类型
           •  DIR     表示目录
           •  CHR     表示字符类型
           •  BLK     块设备类型
           •  UNIX    UNIX 域套接字
           •  FIFO    先进先出 (FIFO) 队列
           •  IPv4    网际协议 (IP) 套接字

    DEVICE: 指定磁盘的名称
    SIZE:   文件的大小
    NODE:   索引节点(文件在磁盘上的标识)
    NAME:   打开文件的确切名称


三、实例演示

使用-c参数,列出vsftpd进程打开的文件

[root@server ~]# lsof -c vsftpd
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
vsftpd  1544 root  cwd    DIR  253,0     4096       128 /
vsftpd  1544 root  rtd    DIR  253,0     4096       128 /
vsftpd  1544 root  txt    REG  253,0   171248 135478222 /usr/sbin/vsftpd
vsftpd  1544 root  mem    REG  253,0   398272 134327237 /usr/lib64/libpcre.so.1.2.0
vsftpd  1544 root  mem    REG  253,0   155744 134327248 /usr/lib64/libselinux.so.1
vsftpd  1544 root  mem    REG  253,0   142296 134741550 /usr/lib64/libpthread-2.17.so
vsftpd  1544 root  mem    REG  253,0   110808 134741552 /usr/lib64/libresolv-2.17.so
vsftpd  1544 root  mem    REG  253,0    15688 134327652 /usr/lib64/libkeyutils.so.1.5
vsftpd  1544 root  mem    REG  253,0    62720 134328180 /usr/lib64/libkrb5support.so.0.1
vsftpd  1544 root  mem    REG  253,0    19888 134327335 /usr/lib64/libattr.so.1.1.0
vsftpd  1544 root  mem    REG  253,0   118792 134327256 /usr/lib64/libaudit.so.1.0.0
vsftpd  1544 root  mem    REG  253,0    90632 134327251 /usr/lib64/libz.so.1.2.7
vsftpd  1544 root  mem    REG  253,0   202576 134328168 /usr/lib64/libk5crypto.so.3.1
vsftpd  1544 root  mem    REG  253,0    15840 134327267 /usr/lib64/libcom_err.so.2.1
vsftpd  1544 root  mem    REG  253,0   950496 134328178 /usr/lib64/libkrb5.so.3.3
vsftpd  1544 root  mem    REG  253,0   316528 134328165 /usr/lib64/libgssapi_krb5.so.2.2
vsftpd  1544 root  mem    REG  253,0  2107816 134317364 /usr/lib64/libc-2.17.so
vsftpd  1544 root  mem    REG  253,0  2012880 134328195 /usr/lib64/libcrypto.so.1.0.1e
vsftpd  1544 root  mem    REG  253,0    19512 134317370 /usr/lib64/libdl-2.17.so
vsftpd  1544 root  mem    REG  253,0    20024 134327294 /usr/lib64/libcap.so.2.22
vsftpd  1544 root  mem    REG  253,0    61648 134329026 /usr/lib64/libpam.so.0.83.1
vsftpd  1544 root  mem    REG  253,0   113320 134317374 /usr/lib64/libnsl-2.17.so
vsftpd  1544 root  mem    REG  253,0    42520 134327602 /usr/lib64/libwrap.so.0.7.6
vsftpd  1544 root  mem    REG  253,0   449864 134328197 /usr/lib64/libssl.so.1.0.1e
vsftpd  1544 root  mem    REG  253,0   164432 134317357 /usr/lib64/ld-2.17.so
vsftpd  1544 root    3u  IPv6  18330      0t0       TCP *:ftp (LISTEN)

使用-u参数,列出root用户打开的文件,只列出前10行

[root@server ~]# lsof -u root | head -n 10
COMMAND    PID USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1 root  cwd       DIR              253,0      4096        128 /
systemd      1 root  rtd       DIR              253,0      4096        128 /
systemd      1 root  txt       REG              253,0   1523624  201648993 /usr/lib/systemd/systemd
systemd      1 root  mem       REG              253,0     20032  134327260 /usr/lib64/libuuid.so.1.3.0
systemd      1 root  mem       REG              253,0    252704  134328361 /usr/lib64/libblkid.so.1.1.0
systemd      1 root  mem       REG              253,0     90632  134327251 /usr/lib64/libz.so.1.2.7
systemd      1 root  mem       REG              253,0    153192  134741572 /usr/lib64/liblzma.so.5.0.99
systemd      1 root  mem       REG              253,0     19888  134327335 /usr/lib64/libattr.so.1.1.0
systemd      1 root  mem       REG              253,0     19512  134317370 /usr/lib64/libdl-2.17.so

使用-p参数,列出指定进程号打开的文件,这里以docker为例。

[root@server ~]# netstat -anpt | grep docker
tcp6       0      0 :::5000                 :::*                    LISTEN      2968/docker-proxy-c 
tcp6       0      0 :::8080                 :::*                    LISTEN      2946/docker-proxy-c 
[root@server ~]# lsof -p 2968
COMMAND    PID USER   FD      TYPE DEVICE SIZE/OFF       NODE NAME
docker-pr 2968 root  cwd       DIR  253,0     4096        128 /
docker-pr 2968 root  rtd       DIR  253,0     4096        128 /
docker-pr 2968 root  txt       REG  253,0  1697904      23974 /usr/libexec/docker/docker-proxy-current
docker-pr 2968 root  mem       REG  253,0  2107816  134317364 /usr/lib64/libc-2.17.so
docker-pr 2968 root  mem       REG  253,0   142296  134741550 /usr/lib64/libpthread-2.17.so
docker-pr 2968 root  mem       REG  253,0   164432  134317357 /usr/lib64/ld-2.17.so
docker-pr 2968 root    0r      CHR    1,3      0t0       1028 /dev/null
docker-pr 2968 root    1w      CHR    1,3      0t0       1028 /dev/null
docker-pr 2968 root    2w      CHR    1,3      0t0       1028 /dev/null
docker-pr 2968 root    4u     IPv6  21080      0t0        TCP *:commplex-main (LISTEN)
docker-pr 2968 root    5u  a_inode    0,9        0       6835 [eventpoll]
docker-pr 2968 root   11r      REG    0,3        0 4026531956 net
docker-pr 2968 root   12u  netlink             0t0      20226 ROUTE
docker-pr 2968 root   13u  netlink             0t0      20227 XFRM

使用-d参数列出FD为txt的文件,仅显示后10行。

[root@server ~]# lsof -d txt | tail -n 10
kworker/u 5801     root txt   unknown                           /proc/5801/exe
kworker/0 5984     root txt   unknown                           /proc/5984/exe
kworker/0 6016     root txt   unknown                           /proc/6016/exe
pickup    6044  postfix txt       REG  253,0   285112  67755903 /usr/libexec/postfix/pickup
kworker/u 6067     root txt   unknown                           /proc/6067/exe
git       6074     root txt       REG  253,3  1577288  46261462 /usr/bin/git
git-remot 6075     root txt       REG  253,3   872424     96329 /usr/lib/git-core/git-remote-http
lsof      6077     root txt       REG  253,0   154072 164789835 /usr/sbin/lsof
tail      6078     root txt       REG  253,0    66776  67245119 /usr/bin/tail
lsof      6079     root txt       REG  253,0   154072 164789835 /usr/sbin/lsof

使用+d参数列出目录下被打开的文件,使用+D参数递归列出目录下被打开的文件。

[root@server ~]# lsof +d /usr/sbin
COMMAND    PID USER  FD   TYPE DEVICE SIZE/OFF      NODE NAME
lvmetad    752 root txt    REG  253,0    52872 134698281 /usr/sbin/lvmetad
auditd     887 root txt    REG  253,0   141592 135338685 /usr/sbin/auditd
irqbalanc  913 root txt    REG  253,0    49624 134698013 /usr/sbin/irqbalance
rsyslogd   917 root txt    REG  253,0   555400 134698082 /usr/sbin/rsyslogd
crond      923 root txt    REG  253,0    70096 134621005 /usr/sbin/crond
agetty     931 root txt    REG  253,0    36840 134534408 /usr/sbin/agetty
NetworkMa 1027 root txt    REG  253,0  1944184 134697928 /usr/sbin/NetworkManager
wpa_suppl 1139 root txt    REG  253,0  1451632 134697601 /usr/sbin/wpa_supplicant
sshd      1539 root txt    REG  253,0   815520 135338852 /usr/sbin/sshd
vsftpd    1544 root txt    REG  253,0   171248 135478222 /usr/sbin/vsftpd
sshd      3365 root txt    REG  253,0   815520 135338852 /usr/sbin/sshd
lsof      6100 root txt    REG  253,0   154072 164789835 /usr/sbin/lsof
lsof      6101 root txt    REG  253,0   154072 164789835 /usr/sbin/lsof
[root@server ~]# lsof +D /usr/lib/
COMMAND    PID    USER  FD   TYPE DEVICE  SIZE/OFF      NODE NAME
systemd      1    root txt    REG  253,0   1523624 201648993 /usr/lib/systemd/systemd
systemd-j  735    root txt    REG  253,0    274752 201649007 /usr/lib/systemd/systemd-journald
systemd-u  753    root txt    REG  253,0    361496 201649021 /usr/lib/systemd/systemd-udevd
systemd-u  753    root mem    REG  253,0    387028  68047258 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.symbols.bin
systemd-u  753    root mem    REG  253,0    681768  67402263 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.alias.bin
systemd-u  753    root mem    REG  253,0    316220  68047255 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.dep.bin
systemd-u  753    root mem    REG  253,0      7744  68047259 /usr/lib/modules/3.10.0-327.el7.x86_64/modules.builtin.bin
firewalld  915    root mem    REG  253,0 106065056 134741571 /usr/lib/locale/locale-archive
systemd-l  918    root txt    REG  253,0    572320 201766817 /usr/lib/systemd/systemd-logind
crond      923    root mem    REG  253,0 106065056 134741571 /usr/lib/locale/locale-archive

lsof -i还可以列出网络连接信息,可以达到类似于netstat命令的效果

[root@server ~]# lsof -i
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1567 root    3u  IPv4  18815      0t0  TCP *:ssh (LISTEN)
sshd      1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
vsftpd    1574 root    3u  IPv6  18759      0t0  TCP *:ftp (LISTEN)
master    2549 root   13u  IPv4  19353      0t0  TCP localhost:smtp (LISTEN)
master    2549 root   14u  IPv6  19354      0t0  TCP localhost:smtp (LISTEN)
docker-pr 2929 root    4u  IPv6  22279      0t0  TCP *:commplex-main (LISTEN)
docker-pr 2967 root    4u  IPv6  22423      0t0  TCP *:webcache (LISTEN)
sshd      3321 root    3u  IPv4  32892      0t0  TCP server:ssh->192.168.200.1:49781 (ESTABLISHED)
[root@server ~]#  netstat -atp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      1567/sshd           
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN      2549/master         
tcp        0     52 server:ssh              192.168.200.1:49781     ESTABLISHED 3321/sshd: root@pts 
tcp6       0      0 [::]:commplex-main      [::]:*                  LISTEN      2929/docker-proxy-c 
tcp6       0      0 [::]:webcache           [::]:*                  LISTEN      2967/docker-proxy-c 
tcp6       0      0 [::]:ftp                [::]:*                  LISTEN      1574/vsftpd         
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      1567/sshd           
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN      2549/master         

使用-i 6显示TYPE为ipv6的连接

[root@server ~]# lsof -i 6
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
vsftpd    1574 root    3u  IPv6  18759      0t0  TCP *:ftp (LISTEN)
master    2549 root   14u  IPv6  19354      0t0  TCP localhost:smtp (LISTEN)
docker-pr 2929 root    4u  IPv6  22279      0t0  TCP *:commplex-main (LISTEN)
docker-pr 2967 root    4u  IPv6  22423      0t0  TCP *:webcache (LISTEN)

使用-i tcp获取协议为tcp的连接

[root@server ~]# lsof -i tcp
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1567 root    3u  IPv4  18815      0t0  TCP *:ssh (LISTEN)
sshd      1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
vsftpd    1574 root    3u  IPv6  18759      0t0  TCP *:ftp (LISTEN)
master    2549 root   13u  IPv4  19353      0t0  TCP localhost:smtp (LISTEN)
master    2549 root   14u  IPv6  19354      0t0  TCP localhost:smtp (LISTEN)
docker-pr 2929 root    4u  IPv6  22279      0t0  TCP *:commplex-main (LISTEN)
docker-pr 2967 root    4u  IPv6  22423      0t0  TCP *:webcache (LISTEN)
sshd      3321 root    3u  IPv4  32892      0t0  TCP server:ssh->192.168.200.1:49781 (ESTABLISHED)

使用-i :22来获取端口为22的连接

[root@server ~]# lsof -i :22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1567 root    3u  IPv4  18815      0t0  TCP *:ssh (LISTEN)
sshd    1567 root    4u  IPv6  18824      0t0  TCP *:ssh (LISTEN)
sshd    3321 root    3u  IPv4  32892      0t0  TCP server:ssh->192.168.200.1:49781 (ESTABLISHED)

使用@host来显示指定到指定主机的连接

[root@server ~]# lsof -n -i @192.168.200.20
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    3321 root    3u  IPv4  32892      0t0  TCP 192.168.200.20:ssh->192.168.200.1:49781 (ESTABLISHED)

使用-a参数联合-d和-c参数,不添加-a参数,命令是不能执行的

[root@server ~]#  lsof -c vsftpd -a -d txt
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF      NODE NAME
vsftpd  1574 root txt    REG  253,0   171248 135478222 /usr/sbin/vsftpd

发表回复

验证码: 6 + 2 =