您的位置:首页 > 运维架构 > Linux

[故障分析]出现大量僵尸进程(zombie)

2017-11-25 15:47 267 查看
环境: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  故障 linux 僵尸进程