概要
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
常用参数
符号 | 含义 | -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/
|