【技术干货】Linux命令“du-sh和df”执行结果存在差异,问题分析及处理过程

发布于:2024-06-11 ⋅ 阅读:(19) ⋅ 点赞:(0)

1.du-sh和df的差异

du和df是两个不同的Linux命令,它们⽤于查看磁盘空间的使⽤情况。但是它们有⼀些区别:

• du(diskusage)会扫描每个⽂件和⽬录,并计算它们的总⼤⼩。[1]du-sh*会显⽰当前⽬录下每个⽂件或⽬录的⼤⼩,以⼈类可读的形式(如KB,MB,GB)。

• df(diskfree)会读取⽂件系统的元数据(superblock),并显⽰每个分区的总⼤⼩,已⽤空间,可⽤空间和使⽤百分⽐。[2]df-h会以⼈类可读的形式显⽰这些信息。

du和df可能不⼀致的原因有以下⼏种:

• du只能扫描已经挂载的⽂件系统,⽽df可以显⽰所有⽂件系统,包括远程或虚拟的。[3]

• du不能统计被删除但仍被进程占⽤的⽂件,⽽df可以。[1]

• du可能受到硬链接或⼦⽬录挂载点等因素的影响,⽽df不会。[1]

2.如何释放被删除但仍被进程占⽤的⽂件

释放被删除但仍被进程占⽤的⽂件的最佳(也是唯⼀)⽅法是结束或重启那些进程。[1]这样,内核就会关闭⽂件描述符,并释放磁盘空间。

如果你不想结束或重启进程,你也可以通过/proc/⽂件系统来截断这些⽂件,使它们的⼤⼩变为0。[2]

例如,如果进程ID是12345,⽂件描述符号是123,你可以执⾏以下命令:

: > "/proc/12345/fd/123"

这样,⽂件就不会占⽤磁盘空间了,但仍然存在于内存中。[2]

如果你想恢复这些被删除的⽂件,你可以使⽤debugfs⼯具来查找它们的inode号,并使⽤dump命令将它们复制到另⼀个位置。[3]例如,如果你知道⽂件名是foo.txt,你可以执⾏以下命令:

sudo debugfs -w /dev/sda1

debugfs: lsdel

debugfs: dump <inode_number> foo.txt

这样,你就可以在当前⽬录下看到foo.txt了。

3.释放已被删除⽂件空间的案例

3.1查看空间⼤⼩

df-h查看根分区占⽤80%,100G的空间使⽤了80G。但是du-sh/*进⾏统计,实际的⽂件空间却很

少。

df -h

du -sh /*

3.2查看已被删除单仍然被进程占⽤的⽂件

lsof | grep delete | sort -nrk 7

可⻅已被删除的⽇志⽂件仍然被进程占⽤了,⽇志⽂件占⽤的空间达到70多G,所有空间⽆法释放。

3.3查看被删除⽂件的所在进程对应的FD

ll /proc/143579/fd

ll /proc/142737/fd

ll /proc/141304/fd

可以看到已被删除的仍然被占⽤的⽂件的fd为5。

3.4截断清空已被删除的⽂件

: > "/proc/143579/fd/5"

3.5查看清空后的效果

lsof | grep delete | sort -nrk 7

df -h

参考资料: