作为软件测试人员,有时我们需要了解僵尸进程在我们系统上的外观。如果我们明确知道哪个程序和进程ID与该僵尸进程相关联,我们可以对其进行各种测试。
什么是僵尸进程?
Linux中的僵尸进程或已消失的进程是已完成的进程,但由于父进程和子进程之间缺乏对应关系,其条目仍保留在进程表中。通常,父进程通过 wait()函数检查其子进程的状态。子进程完成后,等待功能会通知父进程完全从内存中退出该进程。但是,如果父级未能为其任何子级调用wait函数,则子级进程将作为死进程或僵尸进程在系统中保持活动状态。这些僵尸进程可能大量堆积在您的系统上,并影响其性能。
当您运行top命令并且正在运行僵尸时,输出的第二行将显示该僵尸,如下所示:
但是,如果系统上没有正在运行的僵尸进程,则可以按照本文中的描述创建一个用于测试目的的虚拟对象。我们正在Ubuntu 18.04上运行此过程。
创建一个Zombie-Process
在本节中,我们将编写一个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编译器安装在系统上,则需要安装它:
$ 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,正在运行僵尸进程的程序(我们在本教程中运行的僵尸程序)。
您现在已经了解了如何创建简单的虚拟僵尸进程。这将使您了解它在系统上的外观以及如何将其用于测试目的。