问题场景
当服务器某个路径磁盘使用率过高时,需要清理磁盘,但是rm删除大文件后,df查看磁盘空间并没有减少,但du查看显示磁盘空间已经减少
分析原因
某个进程正在连接着被删文件,空间未被释放,需要将该进程kill
df (disk free)
df是通过文件系统来获取空间大小
当我们删除一个文件的时候,这个文件不是马上就在文件系统当中消失,当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件。 所以当一个文件刚删除清空没完全释放时,df 仍会把它计算在内。
du (disk usage)
du关注的是当前存在的、没有被删除的文件。
他计算的大小就是当前他认为存在的所有文件大小的累加和
df -h
du -h -x --max-depth=1 (这种情况下du相较df更加精确)
解决方案
1.查看删除后没有释放的进程
lsof | grep deleted
2.kill该进程
kill -9 10000
附
服务器有可能没有lsof命令 ( lsof: command not found )
I. 服务器为外网或者内网配置了yum源
yum install lsof
II. 服务器需离线安装
1.下载安装包
https://dl.packetstormsecurity.net/UNIX/IDS/lsof/lsof_4.76.tar.gz
2.解压安装包
tar -zxvf lsof_4.76.tar.gz
3.解压源码包
cd lsof_4.76
tar -xvf lsof_4.76_src.tar
4.编译源码
cd lsof_4.76_src
./Configure linux
y
make
注:
可能存在这种尴尬情况 : 因为存储空间满了, 需要删除大文件 , 因为被删除文件还在被其他进程使用着,所以要通过lsof查看deleted相关的进程,但没有lsof命令,需要安装时又显示没有空间(no space)安装lsof 😂
解决方案II :
1、查找已经删除并未解锁的线程
ls -ld /proc/*/fd/* 2>&1 | fgrep '(deleted)'
//查询出来跟在/proc/后面的数字代表线程的pid
2、kill 掉该线程
kill -9 10000