一、什么是僵尸进程和孤儿进程

僵尸进程:一个进程使用fork创建子进程,如果子进程退出而父进程并没有调用wait或者waitpid获取子进程的状态信息,那么子进程的进程描述符任然保存在系统中,这种进程就被称为僵尸进程。
孤儿进程:如果父进程退出而它的一个或多个子进程还在运行,那么这些子进程就被称为孤儿进程。孤儿进程最终将被init进程(1号进程)所收养,并由init进程完成对它们的状态收集工作。

二、问题以及危害

僵尸进程的危害:
一个进程会定期的产生一些子进程,这些子进程由于处理的事情很少,处理完成后会退出,它的声明周期就很短。但是,这些子进程退出之后它们的状态信息还会保留在系统中,它们的父进程只管生成新的子进程并没有去调用wait或者waitpid去获取子进程的状态信息。系统运行一段时间之后就会有大量的僵死进程,用ps命令来查看的话就会看到许多状态为z的进程。我们要解决的话就只能找到那个产生大量僵死进程的父进程,只有杀死掉那个父进程(通过kill发送SIGTERM或SIGKILL),杀死掉那个父进程之后那些僵死进程就成了孤儿进程,孤儿进程会被init进程接管,init会wait掉这些孤儿进程并且释放它们在系统中占用的资源,这些僵死的孤儿进程就会死去。
缘由:
unix里面有一种机制就是父进程要知道子进程结束时的状态信息,每个进程退出的时候内核会释放的掉这个进程的所有资源(包括打开的文件、占用的内存等等)。但还要保留一部分状态信息(进程号、退出状态、运行的时间等等)直到父进程wait或者waitpid才回去释放。这样的话如果进程不去调用wait或者watpid一些进程的状态信息会一直都在系统里面,这些进程号会一直在系统中间,这些进程号就会一直被占用,由于系统使用的进程号是有限的这样长时间就会导致系统不能产生新的进程。
孤儿进程:
孤儿进程是没有危害的,孤儿进程是没有父进程的子进程,当孤儿进程没有父进程时,内核就会init设置为孤儿进程的父进程,init进程就会调用wait去释放那些已经退出的子进程,当孤儿进程完成其声明周期之后,init会释放掉其状态信息。
每一个进程(init除外)在执行exit之后,不会马上消失会留下一个称为僵尸进程的数据结构来等父进程处理。父进程没有及时处理的话,用ps命令来查看就会发现其状态为“z”。父进程及时处理的话,虽然ps之后状态信息不是“z”但并不等于子进程不经过僵尸状态。

三、查看僵尸进程

ps -ef | grep defunct
分类: 运维

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注