环境: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