Linux cron输出导致僵尸进程案例及解决

登录到主机发现服务器上有近40个名称为[sh] 的进程

 

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-------  1 root       root 57G Apr 13 04:02 root
[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"

 

解决办法:  把cron任务的输出定向到空设备上

即将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 *

你可能感兴趣的:(centos)