一台服务器突然停止了服务,毫无征兆的停止了。最后发现是/var满了:
%df -h /var
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1d 19G 19G -200M 120% /var
再向下追查,发现在/var/spool下面:
# du -d 1 -h /var/spool/
4.0K /var/spool/lock
4.0K /var/spool/opielocks
8.0K /var/spool/output
4.0K /var/spool/mqueue
19G /var/spool/clientmqueue
4.0K /var/spool/lpd
19G /var/spool/
那clientmqueue里面到底有什么呢?
习惯性的ls一下——麻烦大了,基本死机了,半天没结果,三分钟后ctrl+C才中止,看来是别想知道里面的文件了,但是可以知道里面的文件数:
# ll | wc -l
18329323
好家伙,近2千万个文件!
看不到文件名,连vi都不行,还是请出find大法找几个文件看看吧:
find /var/spool/clientmqueue -name "*" | more
# find /var/spool/clientmqueue -name "*" | more
/var/spool/clientmqueue
/var/spool/clientmqueue/dft3NKR6v4090134
/var/spool/clientmqueue/dft3NKR6vO090134
/var/spool/clientmqueue/dft3NKR61v090134
/var/spool/clientmqueue/dft3NKR6wf090134
/var/spool/clientmqueue/dft3NKR6x6090134
/var/spool/clientmqueue/dft3NKR602090134
/var/spool/clientmqueue/dft3NKR65m090134
随便找一个文件看看内容,终于在最后找到了一点蛛丝马迹:
cat /var/spool/clientmqueue/dft3NKR6vO090134
……
Message-Id: <201411091900.sA9J00mw088804@ss.test.com>
From: root (Cron Daemon)
To: root
Subject: Cron <root@ss> /usr/local/bin/php /zfs/log/block.php
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
……
原来是cron,又查看了其他的文件,基本上都是cron,有系统本身的daily和month等,也有自已定义的这个block.php,看样子,cron挺尽责,每一次执行都会发一封邮件给root,但长期这样也不是太好,把/var填满了还是比较麻烦的。
再继续找cron为什么给root发信:
man cron
……
-m mailto
Overrides the default recipient for cron mail. Each crontab(5) without MAILTO explicitly set will send mail to the mailto mail null string, usually specified in a shell as '' or "".
……
里面没有说具体的情况,但是提供了一个-m参数,来指定发送的邮件,同时还提到,把它设置为null,或者把MAILTO变量将不再发信,有了这两句,那就好办了:
方法1、到/etc/rc.d/cron里面,加个-m ‘’参数;
方法2、到/etc/crontab里,加上MAILTO=””变量,注意还要修改/var/cron/tab里面的文件,或者用crontab -e来修改;
方法3、FreeBSD标准的做法,用rc系统给cron传去-m变量:在rc.conf中添加一行:
cron_flags=” -m “
至此,/var/就清静多了。
这个只能去掉cron的邮件,要想彻底清静,最好再加上几行,把每日、每周、每月的自动执行也彻底禁止掉,否则还会有部分邮件,在periodic.conf中添加:
daily_clean_hoststat_enable="NO"
daily_status_mailq_shorten="NO"
daily_status_include_submit_mailq="NO"
daily_status_mail_rejects_enable="NO"
daily_submit_queuerun="NO"
如果希望记点日志,也可以用下面的参数修改一下记录的方式,让periodic采取文件的方式而不是邮件的方式:
daily_output="/var/log/daily.log"
weekly_output="/var/log/weekly.log"
monthly_output="/var/log/monthly.log"