本文转自:http://blog.sina.com.cn/s/blog_6226824c01014ee8.html
登录到主机发现服务器上有近40个名称为[sh] <defunct>的进程
Ps –ef 带进程号查 发现是僵尸进程是
发送邮件的/usr/sbin/sendmail -FCronDaemon -i -odi -oem -oi -t进程
杀掉这些僵尸进程
kill -9 `ps -ef|grep def|awk '{print $3}'`
后进行分析如下:
首先查到/var/mail下的root文件将近57G,这是异常的。
后联想到cron,发现root下有cron任务
[root@server mail]# ll -h
total 57G
-rw-------
[root@server mail]# crontab -l
50 23 * * * /sbin/ hwclock --directisa --hctosys
0 5 * * * /starnet/dbbak/dbbak.sh
0 6 8,15,22,30 * * /dmbstart_all
40 11 * * * /dmbstart_all
[root@server mail]#
照成这些现象的原因是crontab中的程序执行,导致输出大量信息到标准设备上,输出的信息又触发了系统的sendmail,把信息当作邮件发给root用户。上述截图里可以发现root这个用户的mail文件已有57G之大,说明输出的信息量大。
crontab 计划内容中定义命令如果有输出信息的话,会调用sendmail把输出信息发到/var/mail文件中,所以如果有大量输出信息,将会造成僵尸进程(defunct);这时候应该在定义的命令后边加上 "> /dev/null 2>&1"
解决办法:
即将crontab里面的每行命令后面加上 > /dev/null 2>&1
并及时清理原root的mail文件。
==============================================================================================
系统默认要发一些邮件(比如cron发的邮件)的时候,首先会把邮件拷贝到这个目录里,然后等待MTA(mail transfer agent) 来处理,MTA做的事情通常是把这个目录中的邮件弄到/var/spool/mqueue里,然后再发送到真正的目的地。出现/var/spool/clientmqueue/非常大的情况通常因为没有合适的MTA发送邮件,就都积累在这里了,假如这里的邮件并不是你需要的,比如是系统默认发的每分钟跑一次的什么什么cron的信,你可以简单的删掉他们。当然,文件多了一些,直接rm -f *,系统可能会说argument too long什么的,没有关系,find /var/spool/clientmqueue/ -type f –delete或者find /var/spool/clientmqueue/ -type f -exec rm {} \+可能对你有帮助,当然这两条命令要求find的版本比较新。如果不幸你的版本比较低,可以尝试find /var/spool/clientmqueue/ -type f -exec rm {} \;
原因分析:系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
解决办法:
1、 将crontab里面的命令后面加上> /dev/null 2>&1
2、 知识点:
2>:重定向错误。
2>&1:把错误重定向到输出要送到的地方。即把上述命令的执行结果重定向到/dev/null,即抛弃,同时,把产生的错误也抛弃。
使用du -sh * 或 du -sh /* 查看目录的大小,查找占用空间大的目录
注:/是系统目录,可以cd到当前目录下执行du -sh *