一、僵尸进程简介:


官方解释:当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

一般在系统中僵尸进程的关键字为defunct或者dead,僵尸进程一般指进程已经死了或者已经停止运行了,但是它仍存在与进程列表中。理想状态下,进程在执行完毕后应该直接释放资源,从进程表中退出,但是由于某些原因,父进程没有读取到子进程的完成状态,父进程就不会回收子进程占用的资源,导致子进程一直存在于进程列表中。

二、如何辨别僵尸进程呢?

通过如下命令:
ps aux | egrep "Z|defunct"

Z标识符在STAT列中,defunct标识符在输出的最后一列中,通过这两个标识符可以确认系统中的僵尸进程。

现在我们还不能直接kill僵尸进程,我们最好唤起父进程,让父进程重新尝试读取僵尸进程的状态,最终由父进程清理僵尸进程,这是最好的处理方法,我们现在需要获取父进程的ID,如下:

 ps -o ppid= <Child PID>

三、 如何清理僵尸进程呢?

我们获取了父进程的ID号,我们可以通过如下命令向父进程发送一个信号:

kill -s SIGCHLD <Parernt PID>

有些时候该命令可能不起作用,那么我们可以直接Kill父进程。

kill -9 <Parernt PID>

 TIPS:将父进程kill掉,将影响所有归属的子进程,准备kill之前,我们需要双重检查以便制造出更多令人忧虑的麻烦。如果系统存在很少的僵尸进程,同时也没有占用更多的系统资源,最好的方法是在下一次的系统维护计划中kill父进程。

四、如何快速创建测试僵尸进程呢?

小A:如果系统没有僵尸进程怎么办呢?

大B:那....

大B:那就创造僵尸进程吧!

使用C语言的fork函数可以快速打造出一个僵尸进程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <linux/wait.h>
int main(int argc,char **argv)
{
        int i=0;
        pid_t pid=fork();
        if(pid==-1) return 0;
        else if(pid==0)
        {
                printf("son pid is %d\n",getpid());
                while(1)
                {
                        printf("son---i=%d\n",i);
                        i++;
                        sleep(1);
                        if(i==5)
                        break;
                }
                printf("son is over!\n");
        }else if(pid>0)
        {
                printf("parent pid is %d\n",getpid());
                while(1) sleep(100);
        }
        return 0;

}

在系统中创建js.c文件,将代码贴进去。

然后: 

gcc -o js js.c    \\编译

./js    \\执行

查看自己创造的僵尸进程:

 后续就可以尝试清理僵尸进程啦。

 

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐