概要
lsof的全称是list of open file
顾名思义,这个命令展示进程打开文件的信息。在linux中,文件夹、普通文件、socket、有名管道、unix domain socket这些都是属于文件范畴。An open file may be a regular file, a directory, a block special file, a character special file, an executing text reference, a library, a stream or a network file (Internet socket, NFS file or UNIX domain socket.)
标准输出信息
名称 | 解释 |
COMMAND | 启动命令 |
PID | 进程id |
USER | 用户名 |
FD | 文件描述符 |
TYPE | 文件类型 |
DEVICE | 设备id,对于目录和普通文件分为major number和minor number,详见参考文献2 |
SIZE/OFF | 文件大小或者偏移量 |
NODE | 对于普通文件来说,指node number |
NAME | 文件名 |
FD详解
值 | 解释 |
cwd | 当前目录 |
txt | 可执行文件(code & data) |
rtd | 根目录 |
mem | memory-mapped文件 |
mmap | memory-mapped设备 |
对于普通文件的文件句柄,后面还可能会跟一个符号,如2w
符号 | 解释 |
r | 只读 |
w | 只写 |
u | 读写 |
常用参数
符号 | 含义 |
-u | 只看特定用户 |
-c | 只看特定进程名 |
-a | 多个flag使用‘与’逻辑,默认之用‘或’逻辑进行展示 |
-p | 只看特定进程 |
+D | 只看特定文件夹,递归展示子文件夹 |
+d | 只看特定文件夹,不递归展示子文件夹 |
-r/+r | 使用repeat模式,定时展示 |
-i | 只看network文件,eg. -i tcp 或 -i :{port-number} |
示例
展示服务器上所有进程打开的文件
lsof
展示某个用户所有进程打开的文件
lsof -u {username}
展示某个用户下的某个进程名打开的文件
lsof -u {username} -c {process-name} -a
展示某个进程id下打开的文件
lsof -p {process-id}
展示某个文件夹下所有打开文件对应的进程
lsof +D {dir-path}
展示某个端口所对应的进程
lsof -i :{port-number}
小技巧
杀掉某个用户名下的所有进程
kill -9 `lsof -t -u {username}`
有时候一个文件被删除掉了(通过ls命令找不到它),但通过df命令发现它仍然占据磁盘空间,这时可以用以下命令进行定位
lsof {path} | grep deleted
参考文献
- Using lsof Command in Linux with Examples
- Linux系统设备(device)的major和minor number_hengshan的专栏-CSDN博客_linux major
- https://www.geeksforgeeks.org/lsof-command-in-linux-with-examples/