今天在生产环境上某个应用去Kafka消费数据一直报错,日志数据疯狂增加,一下子就把磁盘空间占满了,本人当时没想太多直接rm core.log
一波,然后发现磁盘空间并未释放!
原因很显然就是忽略了有应用一直在往其中写数据,直接删除无法释放磁盘空间。遇到这种问题,依据情况不同解决办法可以不一样。
方法一:
首先是找到哪些应用在使用它导致空间没有释放:
$ lsof filename|grep deleted
得到进程号,如果进程不重要可以直接kill再重启。
方法二:
如果应用不能重启呢,这个时候就需要在不重启应用的情况下操作,找到对应进程号后,直接cd /proc/pid/fd
(fd中记录的是这个进程打开的所有文件的信息),pid
是进程号,在通过方法一的lsof
查找到被删除文件信息的时候,其中有一项是FD
,这个值有最后一位去除(最后一位可能是w/r/u等表示文件状态),例如FD值为50w,则在fd
路径下对应的文件是50,直接执行:
$ echo "" > 50
将文件给置空了,然后就发现空间释放了!
上述两个方法是针对问题发生后的解决办法,但是如何避免出现上述问题呢,暂时了解的办法是如果是某个文本占据空间太多需要删除,不要直接rm
删除,用echo "" > filename
的方式先对文本置空,然后如果还是看不顺眼就可以直接rm
删除了,此时即便还有应用在使用它,删除后也会释放空间。
还有一种情况会导致空间未释放是因为删除的文件是inode对应文件的一个硬链接而已,解决办法参考https://blog.csdn.net/klordy_123/article/details/81543850后面写的解决方法!