僵尸进程 & 孤儿进程

时间:2023-12-30 12:17:32

参考博文

基本概念

僵尸进程:是所有进程都会进入的一种进程状态,子进程退出,而父进程并没有调用 wait() 或 waitpid() 获取子进程的状态信息,那么子进程的 PID 和 进程描述符 等资源仍然保存在系统中,这种进程称之为僵尸进程 。僵尸进程会一直以终止状态(释放了内存等资源)保持在进程表里并会一直等待父进程获取其退出状态,但父进程没有回收(父进程出了问题)。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被 init 进程(CentOS7 中是 systemd 进程,进程号为 1)所收养,并由 init 进程对它们完成状态收集工作 。

问题及危害

僵尸进程

如果进程不调用 wait()/waitpid() 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号(或者句柄)而导致系统不能产生新的进程, 此即为僵尸进程的危害,应当避免 。

任何一个子进程(init 除外)在 exit() 之后,都会留下一个称为僵尸进程(Zombie)的数据结构 。

孤儿进程

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了 init 进程(或者 systemd 进程)身上,init 进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为 init,而 init 进程会循环地 wait() 它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init 进程就会代表党和*出面处理它的一切善后工作,因此孤儿进程并不会有什么危害。

重复强调,任何一个子进程(init 除外)在 exit() 之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理 。

解决僵尸进程

僵尸进程的出现,追其根本原因,是其父进程出现了问题,在子进程 exit() 后没有回收子进程的资源,而不是 Linux 系统的问题;此时运行的程序代码逻辑应该是有问题的,需要整改,如果出现僵尸进程,可以通过以下两种方法解决,第一种方法一般不好用:

# 方法一,传递信号给其父进程,命令其回收子进程的资源
kill -CHLD + 父进程号 # 方法二,直接 KILL 掉其父进程,将此进程变成孤儿进程,交给 init 进程管理,init 进程回收此进程的资源
kill -9 + 父进程号