
0 前言
今天国产电脑提示磁盘空间已耗尽,使用用df命令检查文件系统情况,发现/dev/sda2已使用100%。
Linux shell编程学习笔记39:df命令
https://blog.csdn.net/Purpleendurer/article/details/135577571于是开始清理磁盘空间。
第一步是查看已删除、但空间却没有释放的进程。
这里要用到 lsof命令。
1 lsof命令的安装
lsof 命令默认是没有安装的,如果你的系统中没有安装这个命令,那么可以 使用以下命令安装:
2 lsof命令的功能、格式和选项说明
我们像往常输入lsof --help命令,想查看 lsof命令的帮助信息。

尽管 lsof命令不支持--help选项,但给出了帮助信息。
查看 lsof命令 帮助信息正确选项是 -? 或 -h。
2.1 命令功能
lsof 是 List Open File 的缩写, 主要功能是获取和显示被进程打开文件的信息。
2.2 命令格式
2.3 选项说明
| 选项 | 描述 |
|---|---|
| -h | 显示帮助信息 |
| -a | AND选择(默认是或) |
| -b | 避免内核块 |
| -c c | cmd c ^c /c/[bix] |
| +c w | 命令宽度(默认为9) |
| +d s | 显示目录集合s下被打开的文件 |
| -d s | 通过文件描述符(FD)集合s来选择 |
| +D D | 递归处理所有子文件 *慢?* |
| +|-e s | 豁免 s *风险* |
| -E | 显示端点信息 |
| +E | 显示端点信息和文件 |
| +f|-f | +文件系统或 -文件名 |
| +|-f[gG] | flaGs |
| -F [f] | 选择字段;-F?寻求帮助 |
| -g [s] | 排除(^)或选择并打印进程组ID |
| -i | 按 IPv[46] 地址选择:[46][proto][@host|addr][:svc_list|port_list] |
| -K | 列出tasKs(线程) |
| -l | 列出UID号 |
| +|-L [l] | 列表 (+) 抑制 (-) 链路计数 < l (0 = all; default = 0) |
| +m [m] | 使用或创建安装补充 |
| +|-M | 端口映射注册 (-) |
| -n | 没有主机名 |
| -N | 选择NFS文件列表 |
| -o | 列出文件偏移量 -o o o 0t 偏移位数(8) |
| -O | 无开销 *风险* |
| -p s | 排除(^)或选择PIDs -S [t] t秒统计超时(15) |
| -P | 无端口名称 |
| -R | 列出paRent PID |
| + | -r [t[m<fmt>]] |
| -s | 列表文件大小 |
| -s p:s | 排除(^)或选择protocol(p = TCP|UDP) 按名称表示。 |
| S [t] | t 秒统计超时 (默认为15秒) |
| -t | 简洁列表 |
| -T | 禁用TCP/TPI信息 |
| -Tqs | TCP/TPI Q,St(s)信息 |
| -u s | 排除(^)或 选择登录 或 UID集s |
| -U | 选择Unix套接字 |
| -v | 显示版本信息 |
| -V | 详细搜索 |
| +|-w | 警告 |
| -x [fl] | 跨越 +d|+D 文件系统或符号链接 |
| -X | 跳过TCP&UDP*文件 |
| -Z Z | 上下文[Z] |
| -- | 结束选项扫描 |
| name | 选择命名文件或命名文件系统上的文件 |
- 括号中的是默认值
- 集合项使用逗号分隔
- 范围使用破折号分隔
3 使用实例
3.1 lsof : 显示当前所有活跃进程打开的所有文件
显示的内容很多,不好截图。
3.2 lsof | more:分页显示显示当前所有活跃进程打开的所有文件
我们可以使用管道操作符和more命令来分实现分页显示

命令执行后返回的信息默认有10列,说明如下:
1. COMMAND:进程名称
2.PID:进程ID
3.TID:线程ID
4.USER:所属用户
5.FD:文件描述符
可能的类型以及说明如下:
| FD | 说明 |
|---|---|
| cwd | 当前目录 |
| txt | txt文件 |
| rtd | root目录 |
| mem | 内存映射文件 |
6. TYPE:文件类型
可能的值以及说明如下:
| TYPE | 说明 |
|---|---|
| DIR | 目录 |
| REG | 普通文件 |
| CHR | 字符 |
| a_inode | Inode文件 |
| FIFO | 管道或者socket文件 |
| netlink | 网络 |
| unknown | 未知 |
7.DEVICE:设备ID
8. SIZE/OFF:进程大小
9.NODE:文件的Inode号
10.NAME:路径或者链接
后面备注(readlink: Permission denied),是因为当前用户相应的访问权限。
所以使用lsof命令最好有root权限或者赋予普通用于sudo权限。
3.3 lsof +d proc:显示当前目录下的proc目录中被打开的文件信息

3.4 lsof +d proc +l:显示当前目录下的proc目录中被打开的文件信息,其中USER列不显示用户名而显示UID

由于我们使用了 -l选项,所以执行结果中USER列显示的1000是UID










