跳到主要内容

lsof

显示 Linux 系统某个 进程 当前已打开的所有文件列表 lsof -p <pid>

安装

首先执行 lsof 确认是否易已经安装,如果提示未找到该命令,请按下边操作安装 lsof

$ apt install lsof

补充说明

lsof命令 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 命令需要访问核心内存和各种文件,所以需要 root 用户执行。

在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何, 该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。

通常结合如下命令解决系统内存占用高问题:toppskill

语法

$ lsof # 不指定参数,列出所有进程打开的文件
$ lsof <选项> # 指定参数查询

选项

  • -R:列出打开文件存在的进程,包含PPID(父进程ID)
  • -r:列出打开文件存在的进程,包含 TID
  • -c <进程名>:列出指定进程所打开的文件
  • -g:列出GID号进程详情
  • -d <文件号>:列出占用该文件号的进程
  • +d <目录>:列出目录下被打开的文件
  • +D <目录>:递归列出目录下被打开的文件
  • -n <目录>:列出使用NFS的文件
  • -i <条件>:列出符合条件的进程(协议、:端口、 @ip )
  • -p <进程号>:列出指定进程号所打开的文件
  • -u:列出UID号进程详情
  • -h:显示帮助信息
  • -v:显示版本信息

实例

$ lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,2 4096 2 /
init 1 root rtd DIR 8,2 4096 2 /
init 1 root txt REG 8,2 43496 6121706 /sbin/init
init 1 root mem REG 8,2 143600 7823908 /lib64/ld-2.5.so
init 1 root mem REG 8,2 1722304 7823915 /lib64/libc-2.5.so
init 1 root mem REG 8,2 23360 7823919 /lib64/libdl-2.5.so
init 1 root mem REG 8,2 95464 7824116 /lib64/libselinux.so.1
init 1 root mem REG 8,2 247496 7823947 /lib64/libsepol.so.1
init 1 root 10u FIFO 0,17 1233 /dev/initctl
migration 2 root cwd DIR 8,2 4096 2 /
migration 2 root rtd DIR 8,2 4096 2 /
migration 2 root txt unknown /proc/2/exe
ksoftirqd 3 root cwd DIR 8,2 4096 2 /
ksoftirqd 3 root rtd DIR 8,2 4096 2 /
ksoftirqd 3 root txt unknown /proc/3/exe
migration 4 root cwd DIR 8,2 4096 2 /
migration 4 root rtd DIR 8,2 4096 2 /
migration 4 root txt unknown /proc/4/exe
ksoftirqd 5 root cwd DIR 8,2 4096 2 /
ksoftirqd 5 root rtd DIR 8,2 4096 2 /
ksoftirqd 5 root txt unknown /proc/5/exe
events/0 6 root cwd DIR 8,2 4096 2 /
events/0 6 root rtd DIR 8,2 4096 2 /
events/0 6 root txt unknown /proc/6/exe
events/1 7 root cwd DIR 8,2 4096 2 /

输出列信息描述

标识说明
COMMAND进程的名称
PID进程标识符
PPID父进程标识符(需要指定-R参数)
USER进程所有者
PGID进程所属组
FD文件描述符,应用程序通过它识别该文件
TYPE文件类型
DEVICE指定磁盘的名称
SIZE/OFF文件的大小
NODE索引节点(文件在磁盘上的标识)
NAME打开文件的确切名称

文件描述符

标识说明
cwd表示当前工作目录,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn库引用 (AIX);
erFD 信息错误(参见名称栏)
jldjail 目录 (FreeBSD);
ltx共享库文本(代码和数据)
mxx十六进制内存映射类型编号xx
m86DOS合并映射文件
mem内存映射文件
mmap内存映射设备
pd父目录
rtd根目录
tr内核跟踪文件 (OpenBSD)
v86VP/ix 映射文件
0表示标准输出
1表示标准输入
2表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

标识说明
u表示该文件被打开并处于读取/写入模式
r表示该文件被打开并处于只读模式
w表示该文件被打开并处于写入模式
空格表示该文件的状态模式为 unknow,且没有锁定
-表示该文件的状态模式为 unknow,且被锁定

同时在文件状态模式后面,还跟着相关的锁:

标识说明
N对于未知类型的Solaris NFS锁
r用于部分文件的读取锁定
R对整个文件进行读取锁定
w对文件的一部分进行写锁定(文件的部分写锁)
W对整个文件进行写锁定(整个文件的写锁)
u用于任何长度的读写锁
U对于未知类型的锁
x对于文件部分的SCO OpenServer Xenix锁
X对于整个文件的SCO OpenServer Xenix锁
space如果没有锁

文件类型

标识说明
DIR表示目录
CHR表示字符类型
BLK块设备类型
UNIXUNIX 域套接字
FIFO先进先出 (FIFO) 队列
IPv4网际协议 (IP) 套接字
DEVICE指定磁盘的名称
SIZE文件的大小
NODE索引节点(文件在磁盘上的标识)
NAME打开文件的确切名称
REG常规文件

列出指定进程号所打开的文件:

lsof -p <pid>

获取端口对应的进程 ID=>pid

lsof -i:9981 -P -t -sTCP:LISTEN

列出打开文件的进程:

lsof <filename>