如何在 Ubuntu 18.04 LTS 中创建虚拟僵尸进程
作为软件测试人员,我们有时需要知道僵尸进程在我们的系统上是什么样子。如果我们具体知道哪个程序和进程 ID 与该僵尸进程相关联,我们就可以对其运行各种测试。
什么是僵尸进程?
Linux 中的僵尸进程或已失效进程是指已经完成的进程,但由于父进程和子进程之间缺乏对应关系,其条目仍然保留在进程表中。通常,父进程通过 wait() 函数检查其子进程的状态。当子进程完成时,等待函数会通知父进程从内存中完全退出该进程。但是,如果父进程未能为其任何子进程调用等待函数,则子进程在系统中将作为死进程或僵尸进程保持活动状态。这些僵尸进程可能会在您的系统上大量积累并影响其性能。
当您运行 top 命令并且僵尸正在运行时,它将由输出的第二行指示,如下所示:
但是,如果您的系统上没有运行僵尸进程,您可以创建一个虚拟进程用于测试目的,如本文所述。我们在 Ubuntu 18.04 上运行这个过程。
创建僵尸进程
在本节中,我们将编写一个 C 程序来在我们的系统上运行僵尸进程。
打开文本编辑器并输入以下代码:
代码
#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;
}
将此文件另存为zombie.c
通过此代码创建的僵尸进程将运行 60 秒。您可以通过在 sleep() 函数中指定时间(以秒为单位)来增加持续时间。
打开终端并运行以下命令来编译该程序:
cc zombie.c -o zombie
现在将创建一个名为“zombie”的可执行文件。
请注意,如果您的系统上尚未安装 GNU C 编译器,则需要通过以下命令安装 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
该命令将为您提供状态、parentID、进程 ID、正在运行僵尸进程的程序(我们在本教程中运行的僵尸程序)。
您现在已经学会了如何创建一个简单的虚拟僵尸进程。这将使您了解它在系统上的外观以及如何将其用于测试目的。