1、简 介:
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
2、在linux环境下,任何事物都以文件的形式存在,lsof打开的文件可以是:
- 普通文件
- 目录
- 网络文件系统的文件
- 字符或设备文件
- (函数)共享库
- 管道,命名管道
- 符号链接
- 网络文件(例如:NFS file、网络socket,unix域名socket)
- 其它类型的文件
3、lsof输出各列信息的意义如下:
| COMMAND | 进程的名称 PID:进程标识符 |
|---|---|
| USER | 进程所有者 |
| FD | 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 |
| TYPE | 文件类型,如DIR、REG等 |
| DEVICE | 指定磁盘的名称 |
| SIZE | 文件的大小 |
| NODE | 索引节点(文件在磁盘上的标识) |
| NAME | 打开文件的确切名称 |
4、参数及意义
| 参数 | 意义 |
|---|---|
| -a | 列出打开文件存在的进程 |
| -c<进程名> | 列出指定进程所打开的文件 |
| -g | 列出GID号进程详情 |
| -d<文件号> | 列出占用该文件号的进程 |
| +d<目录> | 列出目录下被打开的文件 |
| +D<目录> | 递归列出目录下被打开的文件 |
| -n<目录> | 列出使用NFS的文件 |
| -i<条件> | 列出符合条件的进程。(4、6、协议、:端口、 @ip ) |
| -p<进程号> | 列出指定进程号所打开的文件 |
| -u | 列出UID号进程详情 |
| -h | 显示帮助信息 |
| -v | 显示版本信息 |
5、一般在标准输出、标准错误、标准输入后文件状态模式
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
6、应用
1.列出所有打开的文件:lsof
备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位
2. 列出某个用户打开的文件信息lsof -u username备注: -u 选项,u其实是user的缩写
3. 列出除了某个用户外的被打开的文件信息lsof -u ^root
备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示
4. 通过某个进程号显示该进行打开的文件lsof -p 1
5. 列出多个进程号对应的文件信息lsof -p 1149,1187,1191
6. 列出除了某个进程号,其他进程号所打开的文件信息lsof -p ^1
7 . 列出所有的网络连接,显示所有打开的端口lsof -i
8. 列出所有tcp 网络连接信息lsof -i tcp
9. 列出谁在使用某个端口lsof -i :80
10. 列出谁在使用某个特定的tcp端口lsof -i tcp:80
11. 根据文件描述范围列出文件信息lsof -d 2-3
12.显示所有打开的端口和UNIX domain文件lsof -i -U
13.查看谁正在使用/bin/bash文件,也就是说查找/bin/bash文件相关的进程
14.查看所属root用户进程所打开的文件类型为txt的文件
15. 列出某个用户的所有活跃的网络端口lsof -a -u test -i
16. 列出所有网络文件系统lsof -N
17.域名socket文件lsof -u
18.某个用户组所打开的文件信息lsof -g 5555
19. 根据文件描述列出对应的文件信息lsof -d description(like 2)
20.哪个进程在占用/etc/passwdlsof /etc/passwd
21.查看sendmail进程的文件使用情况lsof -c sendmail
22.显示出那些文件被以courier打头的进程打开,但是并不属于用户zahnlsof -c courier -u ^zahn
23.显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列lsof -D /tmp
24.查看uid是100的用户的进程的文件使用情况lsof -u1000
25.显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接lsof -i [email protected][url]www.akadia.com:123
26.不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)lsof -i [email protected]:ftp -r
27. lsof -n 不将IP转换为hostname,缺省是不加上-n参数lsof -i [email protected]:ftp -n
28. 查看谁正在使用某个文件lsof /filepath/file
29.递归查看某个目录的文件信息lsof +D /filepath/filepath2/
备注: 使用了+D,对应目录下的所有子目录和文件都会被列出
30. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法lsof | grep ‘/filepath/filepath2/’
31. 列出某个程序所打开的文件信息lsof -c mysql
备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了
32. 列出多个程序多打开的文件信息lsof -c mysql -c apache
33. 列出某个用户以及某个程序所打开的文件信息lsof -u test -c mysql