环境:SUSE Linux Enterprise Server 11 SP2

检测到一个suse系统的zombie达到100多个
登录服务器检测

首先查询是哪个进程引起的

ps -ef|grep defu
sfhadm    7444  7443  0 02:10 ?        00:00:00 [test.sh] <defunct>
sfhadm    7463  7462  0 02:12 ?        00:00:00 [test.sh] <defunct>
sfhadm    7481  7480  0 02:14 ?        00:00:00 [test.sh] <defunct>

注:这是我后面重现故障的数据

但是这个脚本并没有问题的,也没人改过,以前一直是正常运行的。

看一下这个脚本的父进程是哪个程序

linux-dkcm:~ # ps -ef|grep 7443
root      7443  3282  0 01:12 ?        00:00:00 /usr/sbin/cron

发现这些进程的父进程都是cron,也就是定时任务程序crontab

进这个用户查看一下

$crontab -l
cannot chdir(/var/spool/cron), bailing out.
/var/spool/cron: Permission denied

发现提示没有权限进入/var/spool/cron这个目录

再看一下这个程序的权限:

ls -la /usr/bin/crontab
-rwxr-xr-x 1 root trusted 40432 Jan 24  2012 /usr/bin/crontab

原来少了s位
s位相当于给普通用户临时提权的作用
crontab 少了s位就没办法执行

加上s位

chmod 6755 /usr/bin/crontab

把原先的僵尸进程全部杀掉
注意:要杀父进程,子进程是杀不掉的

ps -ef|grep defunct|grep -v grep|awk '{print $3}'|xargs kill -9

本来以为成功解决了这个问题

但观察了一下,僵尸进程还是在产生。
查了一下历史记录,发现有人在前一天执行过
chmod 775 /usr -R
这样把/usr目录下所有带有s位的程序全部消除了。

看来还有其它的程序受到了影响而引起crontab的不正常运行。

查看一下crontab是否有调用其它进程:

#pstree
init─┬─acpid
     ├─auditd─┬─audispd───{audispd}
     │        └─{auditd}
     ├─bonobo-activati───{bonobo-activati}
     ├─console-kit-dae───63*[{console-kit-dae}]
     ├─cron───17*[cron─┬─sendmail───postdrop]
     │                 └─test.sh]

原来crond在执行脚本时会调用sendmail将脚本输出信息以邮件的形式发送给crond用户

查看了一下sendmail进程数
果然有很多

ps -ef|grep sendmail|wc -l
309

但是在其它系统中查看,sendmail并没有带s位的,而看pstree中,后面还会调用postdrop处理邮件,在其它系统中查看了一下postdrop,是带有s位的,正是因为前面执行chmod 755 /usr -R
把这个程序的s位也去掉了,引起cron权限问题,而造成进程变成僵尸进程。
给这个程序添加上s位:

chmod 6755 /usr/bin/postdrop

观察了一下,没有再出现僵尸进程了。

可以将/etc/crontab的MAILTO设为””,这样crontab不再发送日志

排查僵尸进程常用命令:
ps -ef|grep defu
strace(有一次就碰到一个脚本产生僵尸进程,就通过这个命令进行跟踪解决的,也是非常有用的一个命令)
lsof
ldd
pstree



发表评论