命令简介

lsof 是一个列出当前系统打开文件的工具。它可以列出每个进程打开的文件信息,包括普通文件、目录、网络文件系统的文件、字符或设备驱动器、共享库、管道和流以及网络文件等。

命令格式

1
lsof [OPTIONS] [FILE]...

其中:

  • OPTIONS: 可选参数,用于控制lsof命令的行为。
  • FILE: 要列出的文件或目录。如果省略,则列出所有打开的文件

参数说明

参数 说明 备注
-a 列出所有打开的文件 全部文件
-c string 只列出指定进程打开的文件 指定进程
-d s 列出进程使用的磁盘文件 仅磁盘文件
-D s 列出指定文件系统类型的文件 指定文件系统
-g 列出GID号进程详情 指定GID
-i 列出所有网络连接 网络连接
-n 不查询DNS,直接显示IP地址 显示IP
-N 不查询IP域名 不查询域名
-o 列出指定的文件级别信息 指定文件信息
-p s 列出指定进程ID打开的文件 指定进程ID
-P 不查询端口名称 不查询端口名
-s 列出文件类型进程发起进程 显示文件类型
-t 列出指定进程的任务ID 指定任务ID
-u 列出UID号所属进程情况 指定UID
-U 使用UNIX套接字进行文件通信 UNIX套接字
+D s 递归列出目录所有文件 递归列出目录
+r s 指定内核目录,使用+的方式逐层深入 指定内核目录

演示实例

基本示例

1.列出当前系统所有打开的文件:

1
lsof

2.列出当前系统所有打开的文件,包括隐藏文件:

1
lsof -a

3.显示文件详细信息:

1
lsof -l

4.以人类可读的方式显示文件大小:

1
lsof -h

5.按修改时间排序文件:

1
lsof -t

过滤文件

1.列出指定进程打开的文件

1
lsof -c nginx

2.列出指定进程 ID 打开的文件:

1
lsof -p PID

3.列出指定用户打开的文件:

1
lsof -u USER

4.列出指定文件类型的文件:

1
lsof -t FILETYPE

5.列出所有网络连接

1
lsof -i

6.列出指定端口连接信息

1
lsof -i :80

7.列出与IP 地址192.168.1.100 建立连接的进程信息

1
lsof [email protected]

8.列出所有磁盘文件

1
lsof -d

9.列出指定文件系统类型的文件

1
lsof -D /dev/sda1

10.递归列出目录下所有文件

1
lsof +D /var/log/

扩展用法

1.使用 -R 选项递归列出所有子目录:

1
lsof -R /home/user

2.使用 -I 选项忽略指定的文件或目录:

1
lsof -I '*.tmp'

3.使用 -x 选项按列排列文件:

1
lsof -x

4.使用 -C 选项按行排列文件:

1
lsof -C

5.使用 -U 选项按文件访问时间排序:

1
lsof -U

6.使用 -k 选项按文件大小排序:

1
lsof -k

7.使用 -p 选项在文件名前添加指示文件类型的字符:

1
lsof -p

8.使用 -f 选项不进行排序:

1
lsof -f

9.使用 -T 选项以时间戳格式显示文件修改时间:

1
lsof -T

10.使用 -q 选项不输出任何信息,仅返回状态码:

1
lsof -q

11.使用 -b 选项显示文件大小的区块数:

1
lsof -b

12.使用 -G 选项显示文件的所属组:

1
lsof -G

13.使用 -o 选项自定义输出格式:

1
lsof -o '%a %u %g %s %T@ %C@ %n'

此外,lsof 命令还有一些扩展用法,例如:

  1. 使用 -X 选项按扩展名排序:
1
lsof -X
  1. 使用 -s 选项按文件大小排序:
1
lsof -s

高级用法

1.使用颜色区分文件类型:

1
lsof --color=auto

2.使用别名:

1
alias ll='lsof -l'

3.使用管道:

1
lsof | grep 'pattern' | wc -l

4.使用通配符:

1
lsof *.txt

5.使用正则表达式:

1
lsof -l | grep '^-' | awk '{print $9}' | sort -u

6.列出进程环境信息:列出进程ID为1234、GID为gid的进程打开的当前工作目录文件信息。

1
lsof -a -p 1234 -g gid -d cwd

7.列出进程内存映射信息

1
lsof -a -p 1234 -d mem

8.杀死指定进程

1
kill -9 `lsof -t -u username -a -c process_name`