LINUX下进程监控与管理工具lsof使用
1.什么是lsof
lsof(list open files)是一个查看当前系统文件的工具。Linux系统中的所有事物都以文件的形式存在,包括常规数据、网络连接和硬件等。lsof工具可以列出当前系统上由进程打开的所有文件和网络连接,以及这些文件和网络连接的详细信息,如文件描述符、进程ID、用户、文件类型、文件名、网络连接等。这些信息对于排查文件访问和网络连接问题非常有用,也可以帮助诊断性能问题和释放资源。
2.lsof打开文件类型
lsof打开的文件可以是:
| 文件类型 | 表示方式 |
|---|---|
| 普通文件 | REG |
| 目录 | DIR |
| 网络文件系统的文件 | NFS |
| 字符设备 | CHR |
| 块设备 | BLK |
| 函数库 | LIB |
| 套接字 | SOCK |
| 管道 | FIFO |
| 命名管道 | FIFO |
| 符号链接 | LNK |
| 网络socket | INET |
| Unix域名socket | unix |
3.lsof命令格式及参数
lsof命令的基本格式为:
lsof [options]
其中,options为lsof的不同参数,用于指定要显示的信息、过滤结果等。
以下是一些常用的lsof参数:
| 参数 | 描述 |
|---|---|
| -c | 仅显示匹配进程名的结果 |
| -p | 仅显示匹配进程ID的结果 |
| -u | 仅显示匹配用户名的结果 |
| -g | 仅显示匹配用户组的结果 |
| -i | 仅显示匹配网络端口的结果 |
| -a | 显示所有匹配条件的结果 |
| -t | 仅显示进程ID |
| -F | 以指定格式输出结果 |
| -h | 不显示表头 |
| -n | 不解析主机名 |
| -P | 不解析端口号 |
| -s | 仅显示匹配协议的结果 |
| -V | 显示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,3 238 64 /
systemd 1 root rtd DIR 253,3 238 64 /
systemd 1 root txt REG 253,3 1628608 67791946 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,3 20064 33717139 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,3 265576 34213169 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,3 90248 33717133 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,3 157424 33717155 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,3 23968 33717159 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,3 19896 33717355 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,3 19248 33656645 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,3 402384 33717119 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,3 2156240 33639071 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,3 142144 33656665 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,3 88776 33554509 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,3 43712 33656669 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,3 277792 34213190 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,3 91800 33717318 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,3 127184 33717162 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,3 61680 34354248 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,3 20048 33717359 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,3 155744 33717131 /usr/lib64/libselinux.so.1
systemd 1 root mem REG 253,3 163312 33639064 /usr/lib64/ld-2.17.so
systemd 1 root mem REG 253,3 1416154 68900363 /etc/selinux/targeted/contexts/files/file_contexts.bin
systemd 1 root mem REG 253,3 296 68010597 /etc/selinux/targeted/contexts/files/file_contexts.local.bin
systemd 1 root mem REG 253,3 45577 68900365 /etc/selinux/targeted/contexts/files/file_contexts.homedirs.bin
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,10 0 6415 [timerfd]
systemd 1 root 4u a_inode 0,10 0 6415 [eventpoll]
systemd 1 root 5u a_inode 0,10 0 6415 [signalfd]
systemd 1 root 6r DIR 0,21 0 9228 /sys/fs/cgroup/systemd
systemd 1 root 7u a_inode 0,10 0 6415 [timerfd]
systemd 1 root 8u netlink 0t0 10996 KOBJECT_UEVENT
systemd 1 root 9r REG 0,3 0 9460 /proc/1/mountinfo
systemd 1 root 10r a_inode 0,10 0 6415 inotify
systemd 1 root 11r REG 0,3 0 4026532019 /proc/swaps
systemd 1 root 12u unix 0xffff8c2434cef2c0 0t0 10129 /run/systemd/private
……

lsof输出各列信息的意义如下:
COMMAND: 打开该文件或网络连接的进程的名称。PID: 打开该文件或网络连接的进程的ID。TID: 线程ID(如果有多线程)。USER: 打开该文件或网络连接的进程的所有者。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,2 4096 923072 /www/server/mysql
mysqld_sa 1229 root rtd DIR 202,2 4096 2 /
mysqld_sa 1229 root txt REG 202,2 964536 1705859 /usr/bin/bash
mysqld_sa 1229 root mem REG 202,2 163312 1707642 /usr/lib64/ld-2.17.so
mysqld_sa 1229 root mem REG 202,2 26970 1708218 /usr/lib64/gconv/gconv-modules.cache
mysqld_sa 1229 root mem REG 202,2 174576 1708269 /usr/lib64/libtinfo.so.5.9
mysqld_sa 1229 root mem REG 202,2 19248 1715559 /usr/lib64/libdl-2.17.so
mysqld_sa 1229 root mem REG 202,2 2156592 1707902 /usr/lib64/libc-2.17.so
mysqld_sa 1229 root mem REG 202,2 106176928 1715553 /usr/lib/locale/locale-archive
mysqld_sa 1229 root mem REG 202,2 61560 1715567 /usr/lib64/libnss_files-2.17.so
mysqld_sa 1229 root 0r CHR 1,3 0t0 17 /dev/null
mysqld_sa 1229 root 1w CHR 1,3 0t0 17 /dev/null
mysqld_sa 1229 root 2u unix 0xffff93695bbc5400 0t0 21536 socket
mysqld_sa 1229 root 255r REG 202,2 27868 923102 /www/server/mysql/bin/mysqld_safe
mysqld 2122 mysql cwd DIR 202,2 4096 938320 /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,3 964536 27829 /usr/bin/bash
bash 6198 root txt REG 253,3 964536 27829 /usr/bin/bash
bash 7743 root txt REG 253,3 964536 27829 /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,5 4096 67 /home/moonrong
bash 8404 moonrong rtd DIR 253,3 238 64 /
bash 8404 moonrong txt REG 253,3 964536 27829 /usr/bin/bash
bash 8404 moonrong mem REG 253,3 106172832 27824 /usr/lib/locale/locale-archive
bash 8404 moonrong mem REG 253,3 61560 33656657 /usr/lib64/libnss_files-2.17.so
bash 8404 moonrong mem REG 253,3 2156240 33639071 /usr/lib64/libc-2.17.so
bash 8404 moonrong mem REG 253,3 19248 33656645 /usr/lib64/libdl-2.17.so
bash 8404 moonrong mem REG 253,3 174576 33717102 /usr/lib64/libtinfo.so.5.9
bash 8404 moonrong mem REG 253,3 163312 33639064 /usr/lib64/ld-2.17.so
bash 8404 moonrong mem REG 253,3 123267 33717113 /usr/share/locale/zh_CN/LC_MESSAGES/bash.mo
bash 8404 moonrong mem REG 253,3 26970 67221303 /usr/lib64/gconv/gconv-modules.cache
bash 8404 moonrong 0u CHR 136,0 0t0 3 /dev/pts/0
bash 8404 moonrong 1u CHR 136,0 0t0 3 /dev/pts/0
bash 8404 moonrong 2u CHR 136,0 0t0 3 /dev/pts/0
bash 8404 moonrong 255u CHR 136,0 0t0 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,2 4096 938320 /www/server/data
mysqld 2122 mysql rtd DIR 202,2 4096 2 /
mysqld 2122 mysql txt REG 202,2 27889560 923100 /www/server/mysql/bin/mysqld
mysqld 2122 mysql mem REG 202,2 163312 1707642 /usr/lib64/ld-2.17.so
mysqld 2122 mysql DEL REG 0,11 22365 /[aio]
mysqld 2122 mysql DEL REG 0,11 22366 /[aio]
mysqld 2122 mysql DEL REG 0,11 22367 /[aio]
mysqld 2122 mysql DEL REG 0,11 22368 /[aio]
mysqld 2122 mysql DEL REG 0,11 22372 /[aio]
mysqld 2122 mysql DEL REG 0,11 22369 /[aio]
mysqld 2122 mysql DEL REG 0,11 22370 /[aio]
mysqld 2122 mysql DEL REG 0,11 22371 /[aio]
mysqld 2122 mysql mem REG 202,2 142144 1707928 /usr/lib64/libpthread-2.17.so
mysqld 2122 mysql mem REG 202,2 6264 1729167 /usr/lib64/libaio.so.1.0.1
mysqld 2122 mysql mem REG 202,2 40600 1707906 /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 17061 0t0 UDP *:sunrpc
rpcbind 603 rpc 7u IPv4 17062 0t0 UDP *:acmaint_transd
rpcbind 603 rpc 8u IPv4 17063 0t0 TCP *:sunrpc (LISTEN)
rpcbind 603 rpc 9u IPv6 17064 0t0 UDP *:sunrpc
rpcbind 603 rpc 10u IPv6 17065 0t0 UDP *:acmaint_transd
rpcbind 603 rpc 11u IPv6 17066 0t0 TCP *:sunrpc (LISTEN)
chronyd 632 chrony 5u IPv4 18059 0t0 UDP localhost:323
chronyd 632 chrony 6u IPv6 18060 0t0 UDP localhost:323
avahi-dae 664 avahi 12u IPv4 16062 0t0 UDP *:mdns
avahi-dae 664 avahi 13u IPv4 16063 0t0 UDP *:55498
cupsd 1063 root 11u IPv6 21159 0t0 TCP localhost:ipp (LISTEN)
cupsd 1063 root 12u IPv4 21160 0t0 TCP localhost:ipp (LISTEN)
sshd 1064 root 3u IPv4 21145 0t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 21154 0t0 TCP *:ssh (LISTEN)
dnsmasq 1495 nobody 3u IPv4 24889 0t0 UDP *:bootps
dnsmasq 1495 nobody 5u IPv4 24892 0t0 UDP mynewjenkis:domain
dnsmasq 1495 nobody 6u IPv4 24893 0t0 TCP mynewjenkis:domain (LISTEN)
master 1508 root 13u IPv4 24918 0t0 TCP localhost:smtp (LISTEN)
master 1508 root 14u IPv6 24919 0t0 TCP localhost:smtp (LISTEN)
sshd 6170 root 3u IPv4 2573749 0t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 6170 root 8u IPv6 2573792 0t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 6170 root 9u IPv4 2573793 0t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 7735 root 3u IPv4 2586301 0t0 TCP mynewjenkis:ssh->129.184.157.101:gttaua (ESTABLISHED)
sshd 7735 root 8u IPv6 2586334 0t0 TCP localhost:6011 (LISTEN)
sshd 7735 root 9u IPv4 2586335 0t0 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 17063 0t0 TCP *:sunrpc (LISTEN)
rpcbind 603 rpc 11u IPv6 17066 0t0 TCP *:sunrpc (LISTEN)
cupsd 1063 root 11u IPv6 21159 0t0 TCP localhost:ipp (LISTEN)
cupsd 1063 root 12u IPv4 21160 0t0 TCP localhost:ipp (LISTEN)
sshd 1064 root 3u IPv4 21145 0t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 21154 0t0 TCP *:ssh (LISTEN)
dnsmasq 1495 nobody 6u IPv4 24893 0t0 TCP mynewjenkis:domain (LISTEN)
master 1508 root 13u IPv4 24918 0t0 TCP localhost:smtp (LISTEN)
master 1508 root 14u IPv6 24919 0t0 TCP localhost:smtp (LISTEN)
sshd 6170 root 3u IPv4 2573749 0t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 6170 root 8u IPv6 2573792 0t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 6170 root 9u IPv4 2573793 0t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 7735 root 3u IPv4 2586301 0t0 TCP mynewjenkis:ssh->129.184.157.101:gtaua (ESTABLISHED)
sshd 7735 root 8u IPv6 2586334 0t0 TCP localhost:6011 (LISTEN)
sshd 7735 root 9u IPv4 2586335 0t0 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 21145 0t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 21154 0t0 TCP *:ssh (LISTEN)
sshd 6170 root 3u IPv4 2573749 0t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 7735 root 3u IPv4 2586301 0t0 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 21159 0t0 TCP localhost:ipp (LISTEN)
cupsd 1063 root 12u IPv4 21160 0t0 TCP localhost:ipp (LISTEN)
sshd 1064 root 3u IPv4 21145 0t0 TCP *:ssh (LISTEN)
sshd 1064 root 4u IPv6 21154 0t0 TCP *:ssh (LISTEN)
master 1508 root 13u IPv4 24918 0t0 TCP localhost:smtp (LISTEN)
master 1508 root 14u IPv6 24919 0t0 TCP localhost:smtp (LISTEN)
sshd 6170 root 3u IPv4 2573749 0t0 TCP mynewjenkis:ssh->129.184.157.101:onbase-dds (ESTABLISHED)
sshd 6170 root 8u IPv6 2573792 0t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 6170 root 9u IPv4 2573793 0t0 TCP localhost:x11-ssh-offset (LISTEN)
sshd 7735 root 3u IPv4 2586301 0t0 TCP mynewjenkis:ssh->129.184.157.101:gtaua (ESTABLISHED)
sshd 7735 root 8u IPv6 2586334 0t0 TCP localhost:6011 (LISTEN)
sshd 7735 root 9u IPv4 2586335 0t0 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,10 0 6415 [timerfd]
systemd-j 384 root 3u unix 0xffff8c2434ce9100 0t0 9487 /run/systemd/journal/stdout
lvmetad 402 root 3u unix 0xffff8c2434cef700 0t0 13448 /run/lvm/lvmetad.socket
systemd-u 421 root 3u unix 0xffff8c2434cefb40 0t0 13478 /run/udev/control
auditd 570 root 3u netlink 0t0 14286 AUDIT
audispd 572 root 3u unix 0xffff8c2434ceaa80 0t0 14288 socket
rtkit-dae 601 rtkit 3u sock 0,7 0t0 17124 protocol: UNIX
udisksd 602 root 3u unix 0xffff8c2335d96e80 0t0 17223 socket
rpcbind 603 rpc 3u unix 0xffff8c24396561c0 0t0 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,3 238 64 /
systemd 1 root rtd DIR 253,3 238 64 /
……
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,10 0 6415 [timerfd]
systemd 1 root 4u a_inode 0,10 0 6415 [eventpoll]
systemd 1 root 5u a_inode 0,10 0 6415 [signalfd]
systemd 1 root 6r DIR 0,21 0 9228 /sys/fs/cgroup/systemd
systemd 1 root 7u a_inode 0,10 0 6415 [timerfd]
systemd 1 root 8u netlink 0t0 10996 KOBJECT_UEVENT
systemd 1 root 9r REG 0,3 0 9460 /proc/1/mountinfo
systemd 1 root 10r a_inode 0,10 0 6415 inotify
systemd 1 root 11r REG 0,3 0 4026532019 /proc/swaps
systemd 1 root 12u unix 0xffff8c2434cef2c0 0t0 10129 /run/systemd/private
systemd 1 root 13u unix 0xffff8c243783c400 0t0 27380 /run/systemd/journal/stdout
浙公网安备 33010602011771号