一、命令介绍
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