centos-rhel服务器相关 / 未分类 · 2012年8月8日

zombie进程

*****************
查看
*****************
如何查看僵尸进程: $ ps -el 其中,有标记为Z的进程就是僵尸进程 S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;Z代表僵死状态;T代表停止或跟踪状态
在Linux中可以用 ps auwx 发现僵尸进程
  a all w/ tty, including other users 所有窗口和终端,包括其他用户的进程
  u user-oriented 面向用户(用户友好)
  -w,w wide output 宽格式输出
  x processes w/o controlling ttys 在僵尸进程后面 会标注
  ps axf 看进程树,以树形方式现实进程列表
  ps axm 会把线程列出来,在linux下进程和线程是统一的,是轻量级进程的两种方式。
  ps axu 显示进程的详细状态
**************
解决
**************
.僵尸进程解决办法:
1 改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
2 把父进程杀掉。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
kill -9 `ps -ef | grep “Process Name” | awk ‘{ print $3 }’`
其中,“Process Name”为处于zombie状态的进程名。
3 杀父进程不行的话,就尝试用skill -t TTY关闭相应终端,TTY是进程相应的tty号(终端号)。但是,ps可能会查不到特定进程的tty号,这时就需要自己判断了。
4 实在不行,重启系统吧,这也是最常用到方法之一。
  ===========================================
  killall kill -15 kill -9 一般都不能杀掉 defunct进程
  用了kill -15,kill -9以后 之后反而会多出更多的僵尸进程
  kill -kill pid fuser -k pid 可以考虑杀死他的parent process,
  kill -9 他的parent process
VMN_10_66_sles10sp1_64:~ # ps -aux | grep Z
Warning: bad ps syntax, perhaps a bogus ‘-‘? See http://procps.sf.net/faq.html
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3625 0.0 0.0 0 0 ? Zs 10:32 0:00 [sh]
root 4290 0.0 0.0 0 0 ? Z 10:32 0:00 [cron]
app28982 12375 0.0 0.0 0 0 ? Z 10:38 0:00 [sshd]
root 13619 0.0 0.0 0 0 ? Zs 10:40 0:00 [recordtime.sh]
root 13790 0.0 0.0 0 0 ? Z 10:40 0:00 [cron]
root 14505 0.0 0.0 2796 652 pts/3 S+ 10:40 0:00 grep Z
参考资料
http://www.51testing.com/?uid-225738-action-viewspace-itemid-206225
http://baike.baidu.com/view/758736.htm