inode问题定位与解决
问题描述
最近在登陆云服务器的时候发现服务器登陆不上,看了下监控已经OOM了,只能重启服务器,重启了以后可以登陆上去,但是发现一些命令总是报错,显示的是磁盘空间已满,但是使用df -Th
的时候发现磁盘并没有满,所以怀疑是inode节点的问题,使用命令发现真的是inode节点的问题:
df -i
分析原因
虽然发现了问题,因为使用这个机器项目是外包出去的,外包那边也不清楚怎么回事,最初怀疑是日志的问题,但是发现日志并没有打太多,这就很纠结了,那应该怎么统计出来是哪里的文件太多了哪?原本打算使用tree命令,但是第一,inode已经满了,软件也装不上。第二,tree不可能统计出来也相当的麻烦。一个一个的找也不太显示,于是自己编写了一行命令:
for i in /*; do echo i; find i | wc -l; done
发现了文件大多都积压在maildrop目录下面
解决办法
解决办法就是删除这些文件,但是删的时候问题又来了,这些文件(大约100多万)如果直接以rm -rf
删除是非常慢的,于是网上搜了一个命令,还没有来得及细看
find 目录 -type f -name '*' -print0 | xargs -0 rm
这下问题解决了,还要分析一下为什么会堆积这么多的文件,网上一搜到处都是,就直接把原因粘贴过来了.
产生原因
linux在执行cron时,会将cron执行脚本中的output和warning信息,都会以邮件的形式发送Cron所有者, 而由于客户环境中的sendmail和postfix没有正常运行,导致邮件发送不成功,全部小文件堆积在了maildrop目录下面,而且没有自动清理转换的机制,所以长达一年的时间,此目录已堆积了大量的文件。
解决方法:
在cron的开头加上如下字段
MAILTO=""