/var分区inode使用完的解决过程之一

并不太想写这篇博客,觉得没太多技术含量。想要写的是下一篇,如何找到系统中哪个目录包含的文件数最多的文章。想一想写文章要连贯,如果只写下一篇不写这篇,当我再回首看的时候也不知道我为什么要写。那么就当凑个数吧,所以有了这篇文章。

执行puppet一直不成功,提示/var下不能创建文件,于是排查了下发现是inode用完了,对于inode我们可以用zabbix的vfs.fs.inode.free进行监控,具体可以参考https://www.zabbix.com/documentation/2.4/manual/config/items/itemtypes/zabbix_agent

/var下不能新建文件,排查思路如下:

1. 首先df -h看下磁盘是否使用完
2. 没有使用完,但不可以新建文件,继续df -i看inode是否用完
3. inode用完了,继续看是哪一个目录下的文件数最多


[root@localhost peiqiang]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       4.0G  731M  3.1G  20% /
tmpfs           7.8G     0  7.8G   0% /dev/shm
/dev/sda4       7.9G  228M  7.3G   3% /tmp
/dev/sda1        12G  6.6G  4.7G  59% /usr
/dev/sda5       7.9G  5.4G  2.2G  72% /var
/dev/sdb1       276G   44G  218G  17% /data1
/dev/sda6       236G  192G   32G  86% /data0
[root@localhost peiqiang]# df -i
Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/sda3        262144  11840   250304    5% /
tmpfs           2037314      1  2037313    1% /dev/shm
/dev/sda4        524288     17   524271    1% /tmp
/dev/sda1        786432 140246   646186   18% /usr
/dev/sda5        524288 514398     9890   99% /var
/dev/sdb1      18317312  14872 18302440    1% /data1
/dev/sda6      15695872 623283 15072589    4% /data0
[root@localhost peiqiang]# ./top-bushy-folders.sh /var/
Wait a moment if you want a good top of the bushy folders...
1.       507050 files in:        /var/spool/clientmqueue
2.       3526 files in:  /var/cfengine/inputs/files/userkeys
3.       351 files in:   /var/lib/php/session
4.       173 files in:   /var/lib/yum/yumdb/l
5.       160 files in:   /var/cfengine/outputs
6.       158 files in:   /var/www/icons
7.       113 files in:   /var/lib/yum/yumdb/p
8.       113 files in:   /var/lib/yum/yumdb/h
9.       74 files in:    /var/lib/yum/yumdb/m
10.      67 files in:    /var/lib/yum/yumdb/c

问题已经找到了,那么就删除文件释放inode,如下:

[root@localhost peiqiang]# pwd
/var/spool/clientmqueue
[root@localhost peiqiang]# rm -f *
/usr/bin/rm: arg list too long
[root@localhost ~]# cd /var/spool/clientmqueue; find . -type f | xargs rm -rf

最后将脚本加入计划任务,防止以后再手动干预:

#clear /var/spool/clientmqueue/
00 06 * * * find /var/spool/clientmqueue/ -type f -mtime +7 -exec rm -f {} \;

/var/spool/clientmqueue/主要存放的是未发送的邮件,这个目录堆积大量文件主要是如下:

  1. crontab中计划任务的输出信息需要通过sendmail发送给相应用户,而sendmail是关闭状态,导致文件飞涨;解决方案在计划任务后加上 > /dev/null 2>&1,直接不输出信息。
  2. 本身就是邮件服务器或者被黑了,疯狂的在发送邮件,sendmail处理不过来,导致文件飞涨;解决方案检查配置,优化业务。

附 top-bushy-folders.sh :

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

echo "Wait a moment if you want a good top of the bushy folders..."

find "$@" -type d -print0 2>/dev/null | while IFS= read -r -d '' file; do
    echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file"
done | sort -nr | head | awk '{print NR".", "\t", $0}'

exit 0

参考资料:

/var/spool/clientmqueue目录文件清理:http://yaksayoo.blog.51cto.com/510938/290069

/var/spool/clientmqueue 佔用磁碟空間的問題:http://blog.xuite.net/david.welltake/home/45865306-%2Fvar%2Fspool%2Fclientmqueue+佔用磁碟空間的問題+linux

Huge disk usage on /var/spool/clientmqueue:https://groups.google.com/forum/#!topic/comp.unix.solaris/3kn-2ovTutM