今天公司服务器突然ssh链接不上,服务器上的服务和nginx也down掉了,无奈之下只能重启服务器。
重启后在启动nginx时报错:
nginx: [crit] pwrite() "/usr/local/nginx/logs/nginx.pid" failed (28: No space left on device)
本以为是磁盘满了,但是通过df -h查看磁盘使用情况,磁盘使用率非常低:
[root@~]# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 4.0G 0 4.0G 0% /dev/shm
inode的使用率也非常低:
[root@ ~]# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
tmpfs 1001K 1 1001K 1% /dev/shm
一筹莫展的时候,试了一下通过du -sh *来查看各个目录的大小,发现/var/spool/postfix/maildrop目录有10G大小,而且里面有大量2K左右的小文件。
百度了一番,终于搞清楚,原来该目录存放的是系统邮件发送日志,由定时任务crond产生。crontab每次执行任务后都会发送邮件,在/etc/crontab文件中会有MAILTO=root来配置邮件接收者。由于服务器并没有做root邮件相关的配置,所以每次执行完定时任务发送邮件都会失败,并记录失败日志到/var/spool/postfix/maildrop中,导致目录过大。
解决方法:
1.先删除/var/spool/postfix/maildrop中的所有文件:
[root@~]# cd /var/spool/postfix/maildrop
#删除该目录下的所有文件,使用rm -rf * 时,会报-bash: /bin/rm: Argument list too long
#因为该目录下的文件数太大,所以需要使用下面的指令进行删除
[root@ maildrop]#ls | xargs -n 10 rm -fr ls
#输出所有的文件名(用空格分割) xargs就是将ls的输出,每10个为一组(以空格为分隔符),作为rm -rf的参数也就是说将所有文件名10个为一组,由rm -rf删除
2.删除完maildrop的文件后,修改定时任务配置文件
#crontab -e 编辑定时任务
[root@ maildrop]# crontab -e
#在第一行添加MAILTO="",这样定时任务执行完后就不会再发送邮件,也就不会产生发送日志
MAILTO=""
0 */1 * * * /usr/local/bns/freemem.sh
****
****
#保存后,重启crond服务
[root@ maildrop]# /sbin/service crond restart