1.什么是lsof
lsof(list open files)是一个查看当前系统文件的工具。Linux系统中的所有事物都以文件的形式存在,包括常规数据、网络连接和硬件等。lsof工具可以列出当前系统上由进程打开的所有文件和网络连接,以及这些文件和网络连接的详细信息,如文件描述符、进程ID、用户、文件类型、文件名、网络连接等。这些信息对于排查文件访问和网络连接问题非常有用,也可以帮助诊断性能问题和释放资源。
2.lsof打开文件类型
lsof打开的文件可以是:
3.lsof命令格式及参数
lsof命令的基本格式为:
lsof [options]
其中,options为lsof的不同参数,用于指定要显示的信息、过滤结果等。
以下是一些常用的lsof参数:
以上只是一部分常用的lsof参数,还有很多其他的参数可以自行查阅lsof的帮助文档。
4.lsof使用实例
4.1无任何参数
在不加任何参数的情况下,lsof会列出所有打开的文件和进程的详细信息。这可能会产生大量的输出,包括很多不必要的信息,因此建议使用其他参数来过滤和限制输出。如果需要列出所有打开的文件和进程的信息,可以使用以下命令:
[root@mynewjenkis ~]# lsof | more
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,323864 /
systemd 1 root rtd DIR 253,323864 /
systemd 1 root txt REG 253,3162860867791946 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,32006433717139 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,326557634213169 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,39024833717133 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,315742433717155 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,32396833717159 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,31989633717355 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,31924833656645 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,340238433717119 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,3215624033639071 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,314214433656665 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,38877633554509 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,34371233656669 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,327779234213190 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,39180033717318 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,312718433717162 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,36168034354248 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,32004833717359 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,315574433717131 /usr/lib64/libselinux.so.1
systemd 1 root mem REG 253,316331233639064 /usr/lib64/ld-2.17.so
systemd 1 root mem REG 253,3141615468900363 /etc/selinux/targeted/contexts/files/file_contexts.bin
systemd 1 root mem REG 253,329668010597 /etc/selinux/targeted/contexts/files/file_contexts.local.bin
systemd 1 root mem REG 253,34557768900365 /etc/selinux/targeted/contexts/files/file_contexts.homedirs.bin
systemd 1 root 0u CHR 1,30t0 1028 /dev/null
systemd 1 root 1u CHR 1,30t0 1028 /dev/null
systemd 1 root 2u CHR 1,30t0 1028 /dev/null
systemd 1 root 3u a_inode 0,1006415 [timerfd]
systemd 1 root 4u a_inode 0,1006415 [eventpoll]
systemd 1 root 5u a_inode 0,1006415 [signalfd]
systemd 1 root 6r DIR 0,2109228 /sys/fs/cgroup/systemd
systemd 1 root 7u a_inode 0,1006415 [timerfd]
systemd 1 root 8u netlink 0t0 10996 KOBJECT_UEVENT
systemd 1 root 9r REG 0,309460 /proc/1/mountinfo
systemd 1 root 10r a_inode 0,1006415 inotify
systemd 1 root 11r REG 0,304026532019 /proc/swaps
systemd 1 root 12u unix 0xffff8c2434cef2c00t0 10129 /run/systemd/private
……

lsof输出各列信息的意义如下:
COMMAND: 打开该文件或网络连接的进程的名称。FD: 文件描述符(File descriptor),是一个与文件或网络连接相关联的整数值。文件描述符可以是读取、写入、追加、定位等等,因此一个进程可以打开同一个文件的多个描述符。对于网络连接,文件描述符的格式为:IPv4/TCP@hostname:port 或 IPv6/TCP@[hostname]:port 或 unix@filename。TYPE: 打开该文件或网络连接的类型,如REG(常规文件)、DIR(目录)、FIFO(命名管道)、CHR(字符设备)、BLK(块设备)、UNIX(Unix域套接字)、IPv4(IPv4套接字)等。DEVICE: 设备的名称或主设备号和次设备号,对于网络连接为IP地址和端口号。SIZE/OFF: 文件的大小或网络连接的偏移量。NODE: 节点号,对于网络连接为远程主机名和端口号或本地套接字地址。对于文件则是索引节点号(Inode)或文件名。
4.2列出某个程序进程所打开的文件信息
[root@ctyun-mymobile ~]# lsof -c mysqld
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 1229 root cwd DIR 202,24096923072 /www/server/mysql
mysqld_sa 1229 root rtd DIR 202,240962 /
mysqld_sa 1229 root txt REG 202,29645361705859 /usr/bin/bash
mysqld_sa 1229 root mem REG 202,21633121707642 /usr/lib64/ld-2.17.so
mysqld_sa 1229 root mem REG 202,2269701708218 /usr/lib64/gconv/gconv-modules.cache
mysqld_sa 1229 root mem REG 202,21745761708269 /usr/lib64/libtinfo.so.5.9
mysqld_sa 1229 root mem REG 202,2192481715559 /usr/lib64/libdl-2.17.so
mysqld_sa 1229 root mem REG 202,221565921707902 /usr/lib64/libc-2.17.so
mysqld_sa 1229 root mem REG 202,21061769281715553 /usr/lib/locale/locale-archive
mysqld_sa 1229 root mem REG 202,2615601715567 /usr/lib64/libnss_files-2.17.so
mysqld_sa 1229 root 0r CHR 1,30t0 17 /dev/null
mysqld_sa 1229 root 1w CHR 1,30t0 17 /dev/null
mysqld_sa 1229 root 2u unix 0xffff93695bbc54000t0 21536 socket
mysqld_sa 1229 root 255r REG 202,227868923102 /www/server/mysql/bin/mysqld_safe
mysqld 2122 mysql cwd DIR 202,24096938320 /www/server/data
……
-c 选项将会列出所有以mysql这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符。
4.3查找某个文件相关的进程
[root@mynewjenkis ~]# lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ksmtuned 697 root txt REG 253,396453627829 /usr/bin/bash
bash 6198 root txt REG 253,396453627829 /usr/bin/bash
bash 7743 root txt REG 253,396453627829 /usr/bin/bash
[root@mynewjenkis ~]#
4.4列出某个用户打开的文件信息
[root@mynewjenkis ~]# lsof -u moonrong
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 8404 moonrong cwd DIR 253,5409667 /home/moonrong
bash 8404 moonrong rtd DIR 253,323864 /
bash 8404 moonrong txt REG 253,396453627829 /usr/bin/bash
bash 8404 moonrong mem REG 253,310617283227824 /usr/lib/locale/locale-archive
bash 8404 moonrong mem REG 253,36156033656657 /usr/lib64/libnss_files-2.17.so
bash 8404 moonrong mem REG 253,3215624033639071 /usr/lib64/libc-2.17.so
bash 8404 moonrong mem REG 253,31924833656645 /usr/lib64/libdl-2.17.so
bash 8404 moonrong mem REG 253,317457633717102 /usr/lib64/libtinfo.so.5.9
bash 8404 moonrong mem REG 253,316331233639064 /usr/lib64/ld-2.17.so
bash 8404 moonrong mem REG 253,312326733717113 /usr/share/locale/zh_CN/LC_MESSAGES/bash.mo
bash 8404 moonrong mem REG 253,32697067221303 /usr/lib64/gconv/gconv-modules.cache
bash 8404 moonrong 0u CHR 136,00t0 3 /dev/pts/0
bash 8404 moonrong 1u CHR 136,00t0 3 /dev/pts/0
bash 8404 moonrong 2u CHR 136,00t0 3 /dev/pts/0
bash 8404 moonrong 255u CHR 136,00t0 3 /dev/pts/0
[root@mynewjenkis ~]#
4.5通过某个进程号显示该进程打开的文件
[root@ctyun-mymobile ~]# lsof -p 2122
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 2122 mysql cwd DIR 202,24096938320 /www/server/data
mysqld 2122 mysql rtd DIR 202,240962 /
mysqld 2122 mysql txt REG 202,227889560923100 /www/server/mysql/bin/mysqld
mysqld 2122 mysql mem REG 202,21633121707642 /usr/lib64/ld-2.17.so
mysqld 2122 mysql DEL REG 0,1122365 /[aio]
mysqld 2122 mysql DEL REG 0,1122366 /[aio]
mysqld 2122 mysql DEL REG 0,1122367 /[aio]
mysqld 2122 mysql DEL REG 0,1122368 /[aio]
mysqld 2122 mysql DEL REG 0,1122372 /[aio]
mysqld 2122 mysql DEL REG 0,1122369 /[aio]
mysqld 2122 mysql DEL REG 0,1122370 /[aio]
mysqld 2122 mysql DEL REG 0,1122371 /[aio]
mysqld 2122 mysql mem REG 202,21421441707928 /usr/lib64/libpthread-2.17.so
mysqld 2122 mysql mem REG 202,262641729167 /usr/lib64/libaio.so.1.0.1
mysqld 2122 mysql mem REG 202,2406001707906 /usr/lib64/libcrypt-2.17.so
……
4.6列出所有的网络连接
[root@mynewjenkis ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 603 rpc 6u IPv4 170610t0 UDP *:sunrpc
rpcbind 603 rpc 7u IPv4 170620t0 UDP *:acmaint_transd
rpcbind 603 rpc 8u IPv4 170630t0 TCP *:sunrpc (LISTEN)
rpcbind 603 rpc 9u IPv6 170640t0 UDP *:sunrpc
rpcbind 603 rpc 10u IPv6 170650t0 UDP *:acmaint_transd
rpcbind 603 rpc 11u IPv6 170660t0 TCP *:sunrpc (LISTEN)
chronyd 632 chrony 5u IPv4 180590t0 UDP localhost:323
chronyd 632 chrony 6u IPv6 180600t0 UDP localhost:323
avahi-dae 664 avahi 12u IPv4 160620t0 UDP *:mdns
avahi-dae 664 avahi 13u IPv4 160630t0 UDP *:55498
cupsd 1063 root 11u IPv6 211590t0 TCP localhost:ipp (LISTEN)
cupsd 1063 root 12u IPv4 211600t0 TCP localhost:ipp (LISTEN)
sshd 1064 root 3u IPv4 211450t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 211540t0 TCP *:ssh (LISTEN)
dnsmasq 1495 nobody 3u IPv4 248890t0 UDP *:bootps
dnsmasq 1495 nobody 5u IPv4 248920t0 UDP mynewjenkis:domain
dnsmasq 1495 nobody 6u IPv4 248930t0 TCP mynewjenkis:domain (LISTEN)
master 1508 root 13u IPv4 249180t0 TCP localhost:smtp (LISTEN)
master 1508 root 14u IPv6 249190t0 TCP localhost:smtp (LISTEN)
sshd 6170 root 3u IPv4 25737490t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 6170 root 8u IPv6 25737920t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 6170 root 9u IPv4 25737930t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 7735 root 3u IPv4 25863010t0 TCP mynewjenkis:ssh->129.184.157.101:gttaua (ESTABLISHED)
sshd 7735 root 8u IPv6 25863340t0 TCP localhost:6011 (LISTEN)
sshd 7735 root 9u IPv4 25863350t0 TCP localhost:6011 (LISTEN)
[root@mynewjenkis ~]#
4.7列出所有tcp 网络连接信息
[root@mynewjenkis ~]# lsof -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 603 rpc 8u IPv4 170630t0 TCP *:sunrpc (LISTEN)
rpcbind 603 rpc 11u IPv6 170660t0 TCP *:sunrpc (LISTEN)
cupsd 1063 root 11u IPv6 211590t0 TCP localhost:ipp (LISTEN)
cupsd 1063 root 12u IPv4 211600t0 TCP localhost:ipp (LISTEN)
sshd 1064 root 3u IPv4 211450t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 211540t0 TCP *:ssh (LISTEN)
dnsmasq 1495 nobody 6u IPv4 248930t0 TCP mynewjenkis:domain (LISTEN)
master 1508 root 13u IPv4 249180t0 TCP localhost:smtp (LISTEN)
master 1508 root 14u IPv6 249190t0 TCP localhost:smtp (LISTEN)
sshd 6170 root 3u IPv4 25737490t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 6170 root 8u IPv6 25737920t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 6170 root 9u IPv4 25737930t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 7735 root 3u IPv4 25863010t0 TCP mynewjenkis:ssh->129.184.157.101:gtaua (ESTABLISHED)
sshd 7735 root 8u IPv6 25863340t0 TCP localhost:6011 (LISTEN)
sshd 7735 root 9u IPv4 25863350t0 TCP localhost:6011 (LISTEN)
[root@mynewjenkis ~]#
4.8列出谁在使用某个端口
[root@mynewjenkis ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1064 root 3u IPv4 211450t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 211540t0 TCP *:ssh (LISTEN)
sshd 6170 root 3u IPv4 25737490t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 7735 root 3u IPv4 25863010t0 TCP mynewjenkis:ssh->129.184.157.101:gtaua (ESTABLISHED)
[root@mynewjenkis ~]#
4.9列出某个用户的所有活跃的网络端口
[root@mynewjenkis ~]# lsof -a -u root -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cupsd 1063 root 11u IPv6 211590t0 TCP localhost:ipp (LISTEN)
cupsd 1063 root 12u IPv4 211600t0 TCP localhost:ipp (LISTEN)
sshd 1064 root 3u IPv4 211450t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 211540t0 TCP *:ssh (LISTEN)
master 1508 root 13u IPv4 249180t0 TCP localhost:smtp (LISTEN)
master 1508 root 14u IPv6 249190t0 TCP localhost:smtp (LISTEN)
sshd 6170 root 3u IPv4 25737490t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 6170 root 8u IPv6 25737920t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 6170 root 9u IPv4 25737930t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 7735 root 3u IPv4 25863010t0 TCP mynewjenkis:ssh->129.184.157.101:gtaua (ESTABLISHED)
sshd 7735 root 8u IPv6 25863340t0 TCP localhost:6011 (LISTEN)
sshd 7735 root 9u IPv4 25863350t0 TCP localhost:6011 (LISTEN)
[root@mynewjenkis ~]#
4.10根据文件描述列出对应的文件信息
要列出进程ID为1234的进程打开的文件描述符为3的文件信息,可以使用以下命令:
[root@mynewjenkis ~]# lsof -p 1234 -d 3
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 3u a_inode 0,1006415 [timerfd]
systemd-j 384 root 3u unix 0xffff8c2434ce91000t0 9487 /run/systemd/journal/stdout
lvmetad 402 root 3u unix 0xffff8c2434cef7000t0 13448 /run/lvm/lvmetad.socket
systemd-u 421 root 3u unix 0xffff8c2434cefb400t0 13478 /run/udev/control
auditd 570 root 3u netlink 0t0 14286 AUDIT
audispd 572 root 3u unix 0xffff8c2434ceaa800t0 14288 socket
rtkit-dae 601 rtkit 3u sock 0,70t0 17124 protocol: UNIX
udisksd 602 root 3u unix 0xffff8c2335d96e800t0 17223 socket
rpcbind 603 rpc 3u unix 0xffff8c24396561c00t0 15767 /var/run/rpcbind.sock
……
4.11列出1号进程打开的文件
[root@mynewjenkis local]# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,323864 /
systemd 1 root rtd DIR 253,323864 /
……
systemd 1 root 1u CHR 1,30t0 1028 /dev/null
systemd 1 root 2u CHR 1,30t0 1028 /dev/null
systemd 1 root 3u a_inode 0,1006415 [timerfd]
systemd 1 root 4u a_inode 0,1006415 [eventpoll]
systemd 1 root 5u a_inode 0,1006415 [signalfd]
systemd 1 root 6r DIR 0,2109228 /sys/fs/cgroup/systemd
systemd 1 root 7u a_inode 0,1006415 [timerfd]
systemd 1 root 8u netlink 0t0 10996 KOBJECT_UEVENT
systemd 1 root 9r REG 0,309460 /proc/1/mountinfo
systemd 1 root 10r a_inode 0,1006415 inotify
systemd 1 root 11r REG 0,304026532019 /proc/swaps
systemd 1 root 12u unix 0xffff8c2434cef2c00t0 10129 /run/systemd/private
systemd 1 root 13u unix 0xffff8c243783c4000t0 27380 /run/systemd/journal/stdout