用途:列出已打开的文件
说明:lsof是一个列出系统当前已打开的文件的工具,在Linux环境中,一切皆文件,包括普通文件,目录,NFS文件,块文件,字符文件,共享库,管道,符号链接,socket等等,这样通过列举程序所操作的文件,可以清楚了解程序的运行情况
在缺省任何选项的情况下,lsof会列出所有活动进程打开的文件
用法:lsof 选项 [绝对路径的进程文件]
显示结果
COMMAND 进程名
PID 进程标识符
USER 进程所有者
FD 文件描述符
TYPE 文件类型,如DIR,REG等
DEVICE 所属设备(主设备号,次设备号)
SIZE/OFF 文件大小
NODE 文件的inode号
NAME 打开的文件名称
选项:
-a 后面要接多个其他选项,表示这些选项之间是and与关系,即必须同时满足;不加-a则为默认的或关系
-c c 列出指定进程所打开的文件,多个指定进程并列时每个前面加-c
以^开头的进程名将被忽略
/c/中间的变量将被视为正则表达式,其中的shell元字符要加引号
+d s 列出目录s下所有被打开的文件,且只列出该目录下面一层,不遍历目录树,默认不跟踪符号链接
-d s 列出s指定的文件描述符的文件,比如 “cwd,1,3” 或者 “^6,^2”
+D D 列出目录D及其子目录中所有被打开的文件,默认不跟踪符号链接,也不进入子目录上的文件系统挂载点
+/-e s 排除指定路径上的文件系统以防止调用内核功能造成block,+e选项排除stat(2),lstat(2)和大多数readlink(2)内核功能调用,-e选项只排除stat(2)和lstat(2)调用
+/-f [cfgGn] f后各参数指定要显示的kernel file struture information,+是显示,-是不显示。-f后不加参数时,所有的路径名参数都将被简单对待,不区分文件系统,例如“-f --/”将搜索所有路径名以/开头的文件,而不仅仅是/根目录下的文件系统
-g [s] 列出指定PGID号的进程打开的文件
-i [i] 列出符合指定网络参数(ipv4,ipv6,协议,端口,ip等)的进程文件,形式有如下几种
46 ipv4或ipv6
protocal 网络协议,如TCP,UDP等
@hostname 主机名
@hostaddr 主机ip地址
service 在/etc/services文件内存在的服务名,比如smtp之类的
port 端口号
常用形式有: lsof -i6 #只显示ipv6有关文件
lsof -i TCP:25 #跟TCP25号端口有关的文件
lsof -i @192.168.1.1 #ipv4地址为192.168.1.1
lsof -i UDP:who #使用UDP端口的某个服务
lsof -i TCP@myhost.local:80 #主机名为myhost.local,使用80端口和TCP协议的文件
lsof -i TCP@foo:1-10,smtp,99
lsof -i tcp@bar:1-smtp
-k k 指定kernel name list文件,取代/vmunix,/mach等
-l 不把UID转换成用户名
+/-L [l] 用于指定是否列出文件连接数,+是开启,-是关闭;对socket和大部分FIFO及pipe文件无效;+L后面不接数字时,默认会列出所有连接数,接数字则会列出小于指定连接数的文件
-n 不进行ip地址到主机名的转换,让lsof程序跑得快点
-N 列出打开的NFS文件
-o 将列出文件偏移地址(file offset),取代原来的SIZE/OFF列
-p s 列出指定PID进程所打开的文件
-P 对于网络文件,不进行port number到port name的转换
+|-r t 重复执行lsof命令,缺省是15s刷新,-r是重复执行直到收到中断信号,+r是重复执行到没有打开的文件,t指定刷新时间
-R 加一列用来显示其父进程的PPID
-u s 列出指定用户名或UID所打开的文件
-U 列出Unix域套接字文件
-x 与-d和+D合用时,跟踪符号链接和文件系统挂载点
典型用法:
1.列出目录下所有打开的文件
lsof 目录路径
lsof -D 目录路径 #递归的列出该目录下所有的子目录中被打开的文件
lsof -d txt #查找所有被打开的txt文件
2.查找谁在使用某个文件
lsof 文件路径
3.列出某用户打开的所有文件
lsof -u 用户名/UID
4.查找某个程序打开的所有文件
lsof -c 进程名 #进程名可以只输入开头字母,会自动列出以此开头的所有进程
lsof -p PID #列出某个PID对应进程打开的文件
lsof -p ^1000 #列出除了PID为1000的进程外所有进程打开的文件
5.列出所有由某个用户或某个进程打开的文件
lsof -u 用户名 -c 进程名
6.列出某个用户的某个进程打开的文件
lsof -a -u root -c crond #列出root用户的crond命令打开的文件,-a代表后面的各选项要同时成立
7.列出网络连接
lsof -i #列出所有i网络连接
lsof -i TCP #列出所有TCP连接
lsof -i :22 #列出所有使用22端口的网络连接
lsof -i :ssh #列出所有使用ssh的网络连接
lsof -i TCP:80
lsof -a -u 用户名 -i #列出某个用户使用的所有网络连接
lsof -i @192.168.1.1 #列出远程主机打开的文件
8.列出某个进程组里的所有进程打开的文件
lsof -g 1234 #PGID为1234的所有进程