MelonBlog

linux命令:lsof

linux中,一切皆文件,所以文件的管理非常重要,今天来看一个管理文件的命令 lsof

lsof及List of Open Files的缩写,从名字可以看出,它是用来查看已经打开的文件列表。


losf不仅仅可以列出常规的文件,还可以列出

block special file
shared library
character special file
regular pipe
named pipe
socket
UNIX domain socket

总之,非常多,但是这篇文章只讲一些常见的文件。

语法

lsof的基本语法:

lsof [option]

常用的选项:

-c [process_name] # 显示指定进程打开的文件
-u [user_name] # 显示指定用户打开的文件
-i # 网络相关
-p [pid] # 显示指定进程打开的文件
-t # 仅仅显示pid,而不显示完整的信息

返回的信息

我用lsof命令展示一个java进程所打开的文件信息,如图:

image

可以看到lsof命令返回了如下文件和进程信息:

COMMAND:进程命令
PID:进程id
USER:用户id
FD:文件描述符(file descriptor)
TYPE:文件类型
DEVICE:设备编号,通过逗号分隔,不同类型的文件,设备编号代表的含义不同
SIZE/OFF:文件大小
NODE:inode编号(inode是linux用来存储文件的元数据的文件)
NAME:文件名


FD列返回的信息主要有如下几种:

cwd:当前工作目录
rtd:root目录
txt:文本文件
mem:内存映射文件
文件描述符+访问模式:由具体的文件描述符(也可以叫文件句柄)和r|w|u组成,r|w|u表示3种文件访问模式:
r:读
w:写
u:读+写


TYPE列返回的信息主要有如下几种:

DIR:目录
REG:常规文件
CHR:字符特殊文件
a_node:Inode文件
FIFO:管道
IPV4|IPV6:套接字

常用案例

# 列出用户ubuntu所打开的文件信息
lsof -u ubuntu 
# 列出除了root用户之外其他用户所打开的socket文件信息
lsof -i -u^root
# 列出使用端口22的进程TCP连接信息
lsof -i TCP:22
# 列出使用了1~1024区间内的端口的TCP连接信息
lsof -i TCP:1-1024
# 列出访问了localhost这个地址的连接信息
lsof -i@localhost
# 列出IPV4类型的文件信息
lsof -i 4
# 列出IPV6类型的文件信息
lsof -i 6
# 列出指定id的进程所打开的文件信息
lsof -p 1384064
# 关闭指定用户打开的所有进程
kill -9 `lsof -t -u linuxtechi`
# 列出指定目录下打开的文件信息
lsof +D /var/log
# 列出打开了指定文件的进程id
lsof -t /data/huanxidi/nohup.out