Linux查看文件夹,已经使用了60g,但是实际只使用了22.81g

2 问题原因

使用rm命令删除文件时,只有当该文件不存在任何link才会被删除

当有进程访问这个文件时,这个文件的实际占用空间就不会释放

du是根据文件名进行的空间统计,使用rm时该文件对系统来说已经不可见,所以不会统计这个文件。

df则是磁盘实际占用的数量

状态为deleted为标记被删除,其实该文件并没有从磁盘中删除,类似windows下的回收站状态。

据称当有其他进程打开某文件时文件被删除,就会将该文件标记为deleted,并删除其目录节点。使用du查看时,因为没有该删除状态文件的节点信息,所以就不做统计,从而导致与df的结果不一致。

查找了下发现系统对rm进行了alias,因为Linux对删除操作没有回收站机制,对rm操作进行了自定义,对删除文件进行移动到/tmp 目录里面,又对/temp删除 但是还是没有发现磁盘空间释放 

执行   lsof | grep deleted发现有大量刚刚删除文件的进程存在,kill掉进程(或者重启进程)

3 解决方案

lsof | grep deleted
lsof | grep delete |sort -nrk 7|more

sort -nrk 7是将已经删除的文件进行大小排序

结果如下:(deleted 状态)

单个杀死进程,执行kill命令

kill -9 27487 (PID)

批量杀死进程

lsof |awk '/deleted/{print $2}'|xargs kill -9

lsof | grep deleted | awk '{if (NR > 1){print $2}}'|uniq | xargs kill -9

详解 awk ‘{if (NR > 1){print $2}}’,获取第二列

        uniq,去重复

       xargs kill -9 ,就是将获取第二列,再通过uniq去重的值,传递给xargs,然后kill -9 进程号

1 问题描述

宝塔,查看使用空间,使用了60g

查看data文件夹,实际只使用了不到24g

df -h
du -sm /data

 

 

Leave a Reply