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;
}