GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erstellen Sie einen Zombie-Prozess

Ein Zombie oder ein "nicht mehr funktionierender Prozess" in Linux ist ein Prozess, der abgeschlossen wurde, dessen Eintrag jedoch aufgrund fehlender Übereinstimmung zwischen den Eltern- und Kindprozessen noch in der Prozesstabelle verbleibt. Normalerweise überwacht ein übergeordneter Prozess den Status seiner untergeordneten Prozesse durch die Funktion wait(). Wenn der Kindprozess beendet ist, signalisiert die Wait-Funktion dem Elternprozess, den Prozess vollständig aus dem Speicher zu verlassen. Wenn der Elternprozess die Wait-Funktion jedoch nicht für einen seiner Kinder aufruft, bleibt der Kindprozess im System als toter oder Zombie-Prozess am Leben. Diese Zombie-Prozesse können sich in großer Zahl auf Ihrem System ansammeln und dessen Leistung beeinträchtigen.

Unten ist ein C-Programm zum Erstellen eines Zombie-Prozesses auf unserem System. Speichern Sie diese Datei als zombie.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;
}

Der durch diesen Code erstellte Zombie-Prozess wird 60 Sekunden lang ausgeführt. Sie können die Zeitdauer erhöhen, indem Sie eine Zeit (in Sekunden) in der Funktion sleep() angeben.

Kompilieren Sie dieses Programm

gcc zombie.c

Führen Sie nun das Zombie-Programm aus:

./a.out

Der Befehl ps zeigt nun auch diesen nicht mehr existierenden Prozess an, öffnet ein neues Terminal und verwendet den folgenden Befehl, um den nicht mehr existierenden Prozess zu überprüfen:

[email protected]:~/process$ ps -ef | grep a.out
aamir    10171  3052  0 17:12 pts/0    00:00:00 ./a.out
aamir    10172 10171  0 17:12 pts/0    00:00:00 [a.out] <defunct> #Zombie process
aamir    10177  3096  0 17:12 pts/2    00:00:00 grep --color=auto a.out

Zitat:

Nach meinem Verständnis findet ein Zombie-Prozess statt, wenn der übergeordnete Prozess vor dem untergeordneten Prozess beendet wird.

Das ist falsch. Gemäß man 2 wait (siehe ANMERKUNGEN) :

Ein Kind, das beendet, aber nicht gewartet wurde, wird zu einem "Zombie".

Wenn Sie also einen Zombie-Prozess erstellen möchten, nach fork(2) , sollte der untergeordnete Prozess exit() sein , und der übergeordnete Prozess sollte sleep() sein vor dem Beenden, was Ihnen Zeit gibt, die Ausgabe von ps(1) zu beobachten .

Sie können beispielsweise den folgenden Code anstelle Ihres eigenen verwenden und ps(1) verwenden während sleep() ing:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
    pid_t pid;
    int status;

    if ((pid = fork()) < 0) {
        perror("fork");
        exit(1);
    }

    /* Child */
    if (pid == 0)
        exit(0);

    /* Parent
     * Gives you time to observe the zombie using ps(1) ... */
    sleep(100);

    /* ... and after that, parent wait(2)s its child's
     * exit status, and prints a relevant message. */
    pid = wait(&status);
    if (WIFEXITED(status))
        fprintf(stderr, "\n\t[%d]\tProcess %d exited with status %d.\n",
                (int) getpid(), pid, WEXITSTATUS(status));

    return 0;
}

Linux
  1. So beenden Sie einen Zombie-Prozess unter Linux

  2. Was sind Zombie-Prozesse und wie findet und tötet man Zombie-Prozesse?

  3. Linux:Finde und töte Zombie-Prozesse

  4. pthread_exit vs. return

  5. Erstellen Sie eine iptables-Regel pro Prozess/Dienst

Erstellen Sie einen Timer unter Linux

So beenden Sie Zombie-Prozesse in Linux

So erstellen Sie einen Dummy-Zombie-Prozess in der Programmiersprache C unter Debian 10

So erstellen Sie einen Dummy-Zombie-Prozess in Ubuntu 18.04 LTS

So töten Sie Zombie-Prozesse in Ubuntu 20.04 LTS

So töten Sie Zombie-Prozesse in Ubuntu