首先说说:僵尸进程是什么?
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。
我们都知道进程的工作原理。我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。进程停止后, 该进程就会从进程表中移除。
僵尸进程啥危害?
由于子进程的结束和父进程的运行是一个不同过程,父进程无法判断子进程什么时候结束. 或者说不知道 子进程什么时候结束,而丢失子进程结束时的状态信息呢? 不会。因为UNⅨ提供可用机制,这种机制就是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程释放. 但这样就导致了问题,如果进程不更新掉,那么保留的那段信息就不会释放,其进程号就会一直被占用,系统进程号有限,如果大量的产生僵尸进程,可能因为进程太多占用无法产生新的进程,这应该避免。
1、那么如何查看僵尸进程呢?
如何查看linux系统上的僵尸进程,或者如何统计有多少僵尸进程?
命令:ps -ef | grep defunct
或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思,使用top命令查看,如果状态为Z也就是(zombie process)说明它就是僵尸进程。
Tasks: 85 total, 2 running, 82 sleeping, 0 stopped, 0 zombie
top命令也可以查看。或者使用下面的命令:
ps -ef | grep defunct | grep -v grep | wc -l
2、如何杀死僵尸进程?
一般僵尸进程很难直接kill掉,不过您可以kill父进程(僵尸父亲),“父亲”死后,僵尸进程成为”孤儿进程”,接着给init它始终会负责清理僵尸进程.紧随着父亲消失了,儿子也就跟着消失了。
ps -e -o ppid,stat | grep Z | cut –d” ” -f2 | xargs kill -9
kill -HUP ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’
当然了,如果您精通其他语言的话,当真是简单方便
3、如何避免僵尸进程?
对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结 束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。
signal(SIGCHLD,SIG_IGN);
用两次fork()参数,而且使紧跟的子进程直接退出,让孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程