lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息,我们都知道,在Linux中,一切皆文件,lsof命令可以查看所有已经打开了的文件,比如: 普通文件,目录,特殊的块文件,管道,socket套接字,设备,Unix域套接字等等,同时,它还可以结合 grep 以及 ps 命令进行更多的高级搜索
安装
lsof 命令默认是没有安装的,而且它的使用需要有root权限或者赋予普通用于sudo权限, 使用以下命令安装
- yum install -y lsof
lsof 命令有很多可选参数,本文根据我自己的使用经验整理了一些比较常用且重要的用法
列出所有打开的文件
不带任何参数执行 lsof 命令会输出当前所有活跃进程打开的所有文件
- [root@ecs-centos-7 ~]# lsof | more
- COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- systemd 1 root cwd DIR 253,1 4096 2 /
- systemd 1 root rtd DIR 253,1 4096 2 /
- systemd 1 root txt REG 253,1 1624520 530313 /usr/lib/systemd/systemd
- systemd 1 root mem REG 253,1 20064 528340 /usr/lib64/libuuid.so.1.3.0
- systemd 1 root mem REG 253,1 265600 532853 /usr/lib64/libblkid.so.1.1.0
- systemd 1 root mem REG 253,1 90248 525942 /usr/lib64/libz.so.1.2.7
- systemd 1 root mem REG 253,1 157424 525955 /usr/lib64/liblzma.so.5.2.2
- systemd 1 root mem REG 253,1 23968 526159 /usr/lib64/libcap-ng.so.0.0.0
- systemd 1 root mem REG 253,1 19896 526135 /usr/lib64/libattr.so.1.1.0
- systemd 1 root mem REG 253,1 19288 525996 /usr/lib64/libdl-2.17.so
- systemd 1 root mem REG 253,1 402384 525931 /usr/lib64/libpcre.so.1.2.0
- systemd 1 root mem REG 253,1 2156160
由于lsof命令会输出很多信息,所以上面例子中使用了 lsof | more 来分页显示命令输出结果
输出结果中,第一列中 systemd 的进程ID是 1,它是一个守护进程
其中列 COMMAND 、PID、USER 分别表示进程名、进程ID、所属用户
列 FD 是文件描述符,下面是可能的类型以及说明
FD | 说明 |
---|---|
cwd | 当前目录 |
txt | txt文件 |
rtd | root目录 |
mem | 内存映射文件 |
列 TYPE 是文件类型,下面是可能的值以及说明
TYPE | 说明 |
---|---|
DIR | 目录 |
REG | 普通文件 |
CHR | 字符 |
a_inode | Inode文件 |
FIFO | 管道或者socket文件 |
netlink | 网络 |
unknown | 未知 |
列 DEVICE 表示设备ID
列 SIZE/OFF 表示进程大小
列 NODE 表示文件的Inode号
列NAME 表示路径或者链接
列出指定用户已打开的文件
使用 -u 选项可以列出指定用户已经打开的文件,该选项后面可以接多个用户名,每个用户名之间用空格隔开,表示列出所有指定用户已打开的所有文件