这篇主要介绍僵尸进程数量异常的排查过程,最终排查到是crond定时任务标准输出多导致的
问题描述
有一台主机经常告警有大量的僵尸进程,不处理也会恢复,但是不正常而且可能会影响到业务,需要排查一下问题原因
初步分析
1、先找出僵尸进程
man ps 找到僵尸进程的相关信息
Processes marked <defunct> are dead processes (so-called "zombies") that remain because their parent has not destroyed them properly.
Z defunct ("zombie") process, terminated but not reaped by its parent
大致意思就是进程已经挂了,但是由于父进程还未销毁,就仍然未回收
2、那我们就得先找到父进程了,发现是定时任务导致的,查看定时任务的脚本,未发现明显异常
# ps -ef|grep defunct
root 10172 10103 0 2021 ? 00:00:00 [sendmail] <defunct>
root 11498 11459 0 May02 ? 00:00:00 [sendmail] <defunct>
root 18615 18555 0 May10 ? 00:00:00 [sendmail] <defunct>
root 18644 18605 0 17:05 ? 00:00:00 [sendmail] <defunct>
root 19872 17552 0 17:05 pts/2 00:00:00 grep --color=auto defunct
root 30109 30041 0 2021 ? 00:00:00 [sendmail] <defunct>
# ps -ef|grep 18605
root 18605 5750 0 17:05 ? 00:00:00 /usr/sbin/CROND -n
root 18610 18605 0 17:05 ? 00:00:00 sh analysis.sh
root 18644 18605 0 17:05 ? 00:00:00 [sendmail] <defunct>
root 21737 17552 0 17:05 pts/2 00:00:00 grep --color=auto 18605
3、网上搜索[sendmail] <defunct> 发现有如下几种情况:
(1)/etc/crontab 的 MAILTO参数 未置空 sendmail defunct 进程重复启动问题 – 尚站互联
(2)Linux cron输出不指空引起的报警问题 Linux cron输出不指空引起的报警问题 - 知乎
4、检查发现第一种情况不是原因,尝试第二种情况,暂时没有大量新增的僵尸进程观测到
5、后期检查监控,发现处理第5条以后,僵尸进程偶有发生,但是不是前期规律性的产生了,问题解决
6、检查系统日志,僵尸进程发生时间段,发现存在如下报错,说是报错缺少库文件
grep 'cron' /var/log/message|more
crond: /usr/sbin/sendmail: error while loading shared libraries:
libmysqlclient.so.18: cannot open shared object file: No such file or directory
7、最终是通过将定时任务的输出重定向解决sendmail 的发起解决的,具体这个sendmail 失败的问题暂时没什么影响
总结
本次大量僵尸进程,应该是第二种情况,由于定时任务执行的脚本产生了大量的标准输出导致crond 去调用 sendmail 去发邮件给用户邮箱,然后没有配置用户邮箱,导致smtp邮件发送失败,产生[sendmail] <defunct> 僵尸进程,这个一般会被回收,但是也可能出现长时间未被回收的情况
另外检查系统日志,发现定时任务有报错,但是仅偶有僵尸进程产生,暂不处理