僵尸进程的模拟与处理

僵尸进程的产生原因是父进程产生子进程之后,子进程先于父进程退出,当时父进程由于某些原因,没有处理子进程发出的退出信号,那么这个子进程就会变成僵尸进程。

首先用 python 模拟一个僵尸进程

#coding=utf8
import os, sys, time
# 产生子进程
pid = os.fork()

if pid == 0:
    # 子进程退出
    sys.exit(0)

# 父进程休息 30 秒
time.sleep(30)

执行之后然后 ps 查看,注意 macOS 下模拟会失败。要在 Linux 下实验。

后面带有 defunct 的就是僵尸进程

避免的方式就是让父进程等待子进程的结束

#父进程启动wait方法
if pid > 0:
    os.wait()

僵尸进程的处理

  • 查看僵尸进程

    ps aux | grep 'Z'
    
  • 处理僵尸进程
    杀死僵尸进程的父进程,则系统 init 进程会接受僵尸进程,负责清理。

  • 僵尸进程的影响
    过多僵尸进程会导致系统无法分配新的可用进程号。

参考
linux僵尸进程的理解和产生僵尸进程模拟
构造僵尸进程