Linux crond 引发的僵尸进程

这篇主要介绍僵尸进程数量异常的排查过程,最终排查到是crond定时任务标准输出多导致的

问题描述

有一台主机经常告警有大量的僵尸进程,不处理也会恢复,但是不正常而且可能会影响到业务,需要排查一下问题原因

初步分析

1、先找出僵尸进程

man ps 找到僵尸进程的相关信息

Processes marked 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] 
root     11498 11459  0 May02 ?        00:00:00 [sendmail] 
root     18615 18555  0 May10 ?        00:00:00 [sendmail] 
root     18644 18605  0 17:05 ?        00:00:00 [sendmail] 
root     19872 17552  0 17:05 pts/2    00:00:00 grep --color=auto defunct
root     30109 30041  0  2021 ?        00:00:00 [sendmail] 
# 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] 
root     21737 17552  0 17:05 pts/2    00:00:00 grep --color=auto 18605

3、网上搜索[sendmail] 发现有如下几种情况:

(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]  僵尸进程,这个一般会被回收,但是也可能出现长时间未被回收的情况

另外检查系统日志,发现定时任务有报错,但是仅偶有僵尸进程产生,暂不处理

你可能感兴趣的:(故障与异常系列,运维,linux,服务器,运维)