如何在 Ubuntu 18.04 LTS 中创建虚拟僵尸进程

作为软件测试人员,我们有时需要知道僵尸进程在我们的系统上的样子。 如果我们明确知道哪个程序和进程 ID 与该僵尸进程相关联,我们可以对其进行各种测试。

什么是僵尸进程?

Linux 中的僵尸进程或已失效进程是指已经完成的进程,但由于父子进程之间缺乏对应关系,它的条目仍保留在进程表中。 通常,父进程通过 wait() 函数检查其子进程的状态。 当子进程完成时,等待函数向父进程发出信号以完全退出内存中的进程。 但是,如果父进程未能为其任何子进程调用等待函数,则子进程在系统中仍作为死进程或僵尸进程保持活动状态。 这些僵尸进程可能会在您的系统上大量堆积并影响其性能。

当你运行 top 命令并且一个僵尸正在运行时,它将由输出的第二行指示如下:

但是,如果您的系统上没有运行僵尸进程,您可以创建一个虚拟程序用于测试目的,如本文所述。 我们在 Ubuntu 18.04 上运行这个过程。

创建僵尸进程

在本节中,我们将编写 ac 程序来在我们的系统上运行僵尸进程。

打开文本编辑器并输入以下代码:

代码

#include <stdlib.h> #include <sys/types.h> #include <unistd.h>int main () { pid_t child_pid;child_pid = fork (); if (child_pid > 0) { sleep (60); } else { exit (0); } return 0; }

Save 这个文件为zombie.c

通过此代码创建的僵尸进程将运行 60 秒。 您可以通过在 sleep() 函数中指定时间(以秒为单位)来增加持续时间。

打开终端并运行以下命令来编译该程序:

$ cc zombie.c -o zombie

现在将创建一个名为zombie 的可执行文件。

请注意,如果系统上尚未安装 GNU C 编译器,则需要通过以下命令安装它:

$ sudo apt-get install build-essential

现在通过以下命令运行僵尸程序:

./zombie

您将看到以下输出:

僵尸文件的输出

测试时可以使用父进程ID(PPID)和子进程ID(PID); 例如通过 kill 命令杀死这个僵尸进程。

在此进程运行时,您可以通过 top 命令在另一个终端窗口中查看系统性能。 您将能够通过输出的第二行看到 1 个僵尸进程。

ps 命令现在还将显示这个已失效的进程和负责它的僵尸程序:

$ ps axo stat,ppid,pid,comm | grep -w defunct

ps 命令的结果

该命令将为您提供状态、父 ID、进程 ID、正在运行僵尸进程的程序(我们在本教程中运行的僵尸程序)。

您现在已经学会了如何创建一个简单的虚拟僵尸进程。 这将使您了解它在系统上的外观以及如何将其用于测试目的。