最近遇到一个非常诡异的Linux磁盘空间被占用的问题,莫名其妙的磁盘满了,使用在根目录du -h命令查看却只占用到12%左右 可直接使用df -h命令查看却显示磁盘已经100%use了,如下图:
实在匪夷所思,后来找到问题是因为之前执行rm -rf删除操作的进程没有正常结束掉,导致虽然文件看着是被删除了(看不到了),但是那个进程还占用着,系统磁盘空间实际上没有被 释放,只是将文件标记为deleted状态,类似windows下的回收站状态。使用du查看时,因为没有该删除状态文件的节点信息,所以就不做统计,从而导致与df的结果不一致。
要解决这个问题只需要将deleted状态文件删除,则根据pid直接kill调相应进程即可。 使用losf命令列出deleted状态的进程号
lsof |grep delete
然后使用kill -9命令删除进程号即可,即上图的第二列,这样状态的文件可能会很多,如何快速删除呢?不要慌有办法的,使用以下命令即可
lsof |grep delete|grep -v grep|cut -c 9-15| xargs kill -9
清理完之后再使用df -h命令看看: 瞬间释放了84G出来,哈哈哈,开心~ 现在和du -h看到的一致了
说明
列出了当前主机中运行的进程中delete状态的进程
lsof | grep delete | grep -v grep
截取第9至15字符(进程id),列出了要kill掉这些进程的id,并将之打印在了屏幕上
lsof | grep delete | grep -v grep | cut -c 9-15
后面加上'xargs kill -9'后,则执行这些命令,进而杀掉了这些进程
lsof | grep delete | grep -v grep | cut -c 9-15 | xargs kill -9
据说lsof是个很强大的命令,可以用来代替netstat和ps命令,有兴趣的同学可以百度一下具体用法
来源:oschina
链接:https://my.oschina.net/u/3696256/blog/3198096