linux下,一切皆文件,包括files、pipes、sockets、directories、devices等等。
1.lsof相关常用链接
通过"lsof --help"我们可以看到几个重要的链接
(1)最新版本代码:https://github.com/lsof-org/lsof
(2)最新FAQ:https://github.com/lsof-org/lsof/blob/master/00FAQ
(3)最新使用文档:https://github.com/lsof-org/lsof/blob/master/Lsof.8
2.常用命令行选项
通过"lsof --help"可以看到工具支持的命令行选项。共有以下几种
-a:表示其他选项之间为”与“的关系;
-c {进程名}:列出指定进程所打开的文件;
-g:列出指定GID号进程详情;
-d {文件号}:列出占用该文件号的进程;
+d {目录}:列出目录下被打开的文件;
+D {目录}:递归列出目录下被打开的文件;
-n {目录}:列出使用NFS的文件;
-i {条件}:列出符合条件的进程(协议、:端口、 @ip )
-p {进程号}:列出指定进程号所打开的文件;
-u:列出指定UID号或用户名的进程详情;
-h或-?:显示帮助信息;
-v:显示版本信息
-t:只显示进程id
-r {time-interval}:重复执行,直到它接收到来自用户的中断/终止信号
+r {time-interval}:重复模式将在其输出没有打开文件时立即结束
3.lsof输出信息
lsof命令输出的信息中,主要有以下字端
(1)COMMAND
进程名称
(2)PID
进程号
(3)PPID
父进程号
(4)USER
进程所有者
(5)FD
文件描述符,应用程序通过文件描述符识别该文件。
cwd:当前目录
txt:程序文本,如应用程序二进制文件或共享库
Lnn:库引用 library references (AIX)
err:文件描述符信息错误
jld:jail目录(FreeBSD)
ltx:共享库文本(代码和数据)
mxx:十六进制内存映射类型编号xx
m86:DOS合并映射文件
mem:内存映射文件
mmap:内存映射设备
pd:父目录
rtd:根目录
tr:内核跟踪文件(OpenBSD)
v86:VP/ix 映射文件
0:标准输入
1:标准输出
2:标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
u:表示该文件被打开并处于读取/写入模式
r:表示该文件被打开并处于只读模式
w:表示该文件被打开并处于写入模式
空格:表示该文件的状态模式为 unknow,且没有锁定
-:表示该文件的状态模式为 unknow,且被锁定
(6)TYPE
文件类型,常见的类型有以下6种。
(7)DEVICE
指定磁盘名称
(8)SIZE
文件的大小
(9)NODE
索引节点,文件在磁盘上的唯一标识。
(10)NAME
表示打开文件的具体名称
4.lsof使用场景
主要有以下使用场景。
(1)文件被哪个进程占用
lsof {文件全路径}
(2)显示目录下被进程打开的文件
有两种用法
# 查看当前目录下被打开的文件,不会查看子目录
lsof +d {目录全路径}
# 查看当前目录及其字目录下被打开的文件
lsof +D {目录全路径}
(3)检查端口是否被占用
# 检查端口是否被使用
lsof -i:{端口号}
# 列出所有TCP或UDP协议的文件
lsof -i TCP/UDP
# 列出使用了TCP协议,且端口号为80的文件
lsof -i TCP:80
# 列出使用了TCP协议,且端口号为1-1024的文件
lsof -i TCP:1-1024
(4)查看指定用户的进程打开的文件
lsof -u {用户名}
(5)通过文件描述符来查找进程
lsof -d {FD}
(6)列出指定进程号打开的文件
# 指定单个进程
lsof -p {进程号}
# 指定多个进程,通过逗号分隔
lsof -p {进程号1},{进程号2},{进程号3}
# 如果想排除某个进程打开的文件,可通过^符号,比如排除{进程号4}打开的文件
lsof -p {进程号1},^{进程号4}
(7)kill指定用户的所有进程
kill -9 `lsof -t -u testuser`