Wie geht Linux mit Zombie-Prozessen um?

12

Zombie-Prozesse werden in Unix / Linux-Systemen erstellt. Wir können sie über den killBefehl entfernen .

Aber gibt es in Linux einen eingebauten Bereinigungsmechanismus, um Zombie-Prozesse zu handhaben?

Atur
quelle

Antworten:

18

Zombie-Prozesse sind bereits tot. Du kannst sie nicht töten. Der killBefehl oder Systemaufruf hat keine Auswirkungen auf einen Zombie-Prozess. (Sie können einen Zombie dazu bringen, mit killihm zu verschwinden, aber Sie müssen den Elternteil erschießen, nicht den Zombie, wie wir gleich sehen werden.)

Ein Zombie-Prozess ist eigentlich kein Prozess, sondern nur ein Eintrag in der Prozesstabelle. Es gibt keine anderen Ressourcen, die mit dem Zombie-Prozess verbunden sind: Er hat keinen Speicher oder laufenden Code, er hält keine Dateien offen usw.

Wenn ein Prozess stirbt, ist das Letzte, was zu tun ist, nachdem alle anderen Ressourcen bereinigt wurden, der Eintrag in der Prozesstabelle. Dieser Eintrag wird als Zombie gespeichert, damit der übergeordnete Prozess den Austrittsstatus des untergeordneten Elements nachverfolgen kann. Das übergeordnete waitElement liest den Beendigungsstatus, indem es eine der Systemaufruffamilien aufruft. Zu diesem Zeitpunkt verschwindet der Zombie. Die Berufung waitsoll das Kind ernten und die Metapher eines Zombies erweitern, der tot ist, aber in gewisser Weise immer noch nicht vollständig zum Leben nach dem Tod verarbeitet wird. Der Elternteil kann auch angeben, dass es ihm egal ist (indem er das SIGCHLD-Signal ignoriert oder sigactionmit dem SA_NOCLDWAITFlag aufruft ). In diesem Fall wird der Eintrag in der Prozesstabelle sofort gelöscht, wenn das Kind stirbt.

Ein Zombie existiert also nur, wenn ein Prozess gestorben ist und sein Elternteil noch nicht angerufen waithat. Dieser Zustand kann nur so lange andauern, wie das übergeordnete Element noch ausgeführt wird. Wenn der Elternteil vor dem Kind stirbt oder stirbt, ohne den Status des Kindes zu lesen, wird der Elternprozess des Zombies auf den Prozess mit der PID 1 gesetzt init. Eine der Aufgaben von initist es, waiteine Schleife aufzurufen und so jeden Zombie-Prozess zu ernten, der von seinem Elternteil zurückgelassen wird.

Gilles 'SO - hör auf böse zu sein'
quelle
6

Du bist kein killZombie-Prozess, da er bereits tot ist.

Zombie-Prozesse müssen waitvon ihren Eltern bearbeitet werden , damit ihr Exit-Status gesammelt werden kann.

Der einzige "eingebaute Bereinigungsmechanismus", den es in Linux gibt, funktioniert für den Fall, dass ein übergeordneter Prozess stirbt, bevor er den Exit-Status seiner Kinder erfasst. In diesem Fall wird jedes untergeordnete Element von dem initProzess geerbt , der waitfür das untergeordnete Element seinen Beendigungsstatus erfasst und seinen Eintrag in der Prozesstabelle entfernt.

chrk
quelle
3

Sobald der Elternteil eines Prozesses stirbt, wird der Prozess zu einer Waise - unabhängig davon, ob es sich um einen Zombie handelt oder nicht. Was passiert mit Waisenkindern? Sie bekommen einen neuen Elternteil, genannt init. initwird waitauf jedes Waisenkind angewendet, das es gesammelt hat, und erntet damit das Waisenkind (das möglicherweise auch ein Zombie war).

Philipp Murry
quelle
1
Nein, genau zu sein, inittötet keinen Prozess. Es liegt nur waitan seinen Kindern, ihren Status zu sammeln.
20.
1
@chrk, Philipp: Der übliche Begriff ist ernten .
Gilles 'SO - hör auf böse zu sein'
1

Nein, es gibt keinen eingebauten Reinigungsmechanismus für Zombies. Zombies gehen in den Himmel der Zombies, sobald ihre Eltern getötet wurden. Bis dahin behält das Betriebssystem sie bei, um den Exit-Status an das übergeordnete Element zurückzugeben.

entmutigen
quelle
Also ... hat das keine negativen Auswirkungen auf das Gedächtnis usw.?
1
Tatsächlich, wenn der Elternteil des Zombies stirbt, initübernimmt der Prozess und nennt waitihn
Nein, mit Ausnahme des Eintrags in der Prozesstabelle werden alle dem Prozess zugewiesenen Ressourcen freigegeben.
Unxnut