一、lsof简介
lsof(list open files)是一个列出当前系统打开文件的工具。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
二、lsof命令格式
lsof [参数] [文件]
三、lsof输出信息的含义
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件
TYPE:文件类型
DEVICE:指定文件磁盘的名称
SIZE:文件的大小
NODE:索引节点
NAME:打开文件的确切名称
四、lsof常用参数
lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。
lsof filename 显示打开指定文件的所有进程
- -a 列出打开文件存在的进程
- -c <进程名> 列出指定进程所打开的文件
- -u username 显示所属user进程打开的文件
- -g gid 列出GID号进程详情
- -d<文件号> 列出占用该文件号的进程
- +d<目录> 列出目录下被打开的文件
- +D<目录> 递归列出目录下被打开的文件
- -n<目录> 列出使用NFS的文件
- -i<条件> 列出符合条件的进程。
- -p<进程号> 列出指定进程号所打开的文件
- -h 显示帮助信息
- -v 显示版本信息
例题:
- 查看22端口现在运行的状况
[root@mail ~]# lsof -i 22
- 看所属root用户进程所打开的文件类型为txt的文件
[root@mail ~]# lsof -a -u root -d txt COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root txt REG 253,0 1612152 16928141 /usr/lib/systemd/systemd kthreadd 2 root txt unknown /proc/2/exe ksoftirqd 3 root txt unknown /proc/3/exe kworker/0 5 root txt unknown /proc/5/exe kworker/u 6 root txt unknown /proc/6/exe migration 7 root txt unknown /proc/7/exe rcu_bh 8 root txt unknown /proc/8/exe rcu_sched 9 root txt unknown /proc/9/exe
- 查看谁正在使用/bin/bash文件,也就是说查找/bin/bash文件相关的进程
[root@mail ~]# lsof /bin/bash COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1048 root txt REG 253,0 960472 50334124 /usr/bin/bash bash 1077 root txt REG 253,0 960472 50334124 /usr/bin/bash