lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
选项
选项 | 描述 |
---|---|
-a | 列出打开文件存在的进程; |
-c<进程名> | 列出指定进程所打开的文件; |
-g | 列出GID号进程详情; |
-d<文件号> | 列出占用该文件号的进程; |
+d<目录> | 列出目录下被打开的文件; |
+D<目录> | 递归列出目录下被打开的文件; |
-n<目录> | 列出使用NFS的文件; |
-i<条件> | 列出符合条件的进程。(4、6、协议、:端口、 @ip ) |
-p<进程号> | 列出指定进程号所打开的文件; |
-u | 列出UID号进程详情; |
-h | 显示帮助信息; |
-v | 显示版本信息。 |
如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。由于输出内容太多,这里只取前十行作为示例,如下:
[root@centos7 ~]# lsof |sed -n '1,10p'
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1632776 34111359 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 33612035 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265576 33930342 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 33612015 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 157424 33612020 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,0 23968 33612146 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,0 19896 33612136 /usr/lib64/libattr.so.1.1.0
可以看到输出内容中都包含这些信息:
COMMAND | 进程的名称 |
---|---|
PID | 进程标识符 |
PPID | 父进程标识符(需要指定-R参数) |
USER | 进程所有者 |
PGID | 进程所属组 |
FD | 文件描述符,应用程序通过文件描述符识别该文件。 |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
下面简单介绍一下 FD 列和 TYPE 列中的常见内容。
FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件;还有一部分 FD 是以数字表示的,比如标准输入输出文件:数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:
docker-co 19350 19941 root 0r CHR 1,3 0t0 7516 /dev/null
docker-co 19350 19941 root 1u unix 0xffff97f6356ed940 0t0 131546 socket
docker-co 19350 19941 root 2u unix 0xffff97f6356ed940 0t0 131546 socket
docker-co 19350 19941 root 3u unix 0xffff97f6356e9980 0t0 131548 /var/run/docker/libcontainerd/docker-containerd.sock
docker-co 19350 19941 root 4u a_inode 0,10 0 7512 [eventpoll]
docker-co 19350 19941 root 5u a_inode 0,10 0 7512 [eventpoll]
docker-co 19350 19941 root 6w REG 0,20 1604 102553 /run/docker/libcontainerd/containerd/events.log
docker-co 19350 19941 root 7u unix 0xffff97f62a61d0c0 0t0 131551 /var/run/docker/libcontainerd/docker-containerd.sock
FD文件描述符列表
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX)(库引用);
er:FD information error (see NAME column)(fd信息错误);
jld:jail directory (FreeBSD)(监控目录);
ltx:shared library text (code and data)(共享库文本);
mxx :hex memory-mapped type number xx(十六进制内存映射类型号xx);
m86:DOS Merge mapped file(DOS合并映射文件);
mem:memory-mapped file(内存映射文件);
mmap:memory-mapped device(内存映射设备);
pd:parent directory(父目录);
rtd:root directory(跟目录);
tr:kernel trace file (OpenBSD)(内核跟踪文件);
v86 VP/ix mapped file(VP/IX映射文件);
0:表示标准输出
1:表示标准输入
2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。
同时在文件状态模式后面,还跟着相关的锁:
N:for a Solaris NFS lock of unknown type(对于未知类型的Solaris NFS锁);
r:for read lock on part of the file(用于对文件的一部分进行读取锁定);
R:for a read lock on the entire file(整个文件的读取锁定);
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length(对于任意长度的读写锁);
U:for a lock of unknown type(对于未知类型的锁);
x:for an SCO OpenServer Xenix lock on