Re: Zombies

From: Oliver Fromme <olli(at)secnetix.de>
Date: Wed, 26 Mar 2003 21:00:40 +0100 (CET)

Dieter Deinert <dd(at)radio-do.ath.cx> wrote:
> Am Mittwoch, 26. März 2003 18:34 schrieb Oliver Fromme:
> > Du kannst ja mal testweise ein SIGCHLD an den sntop-Prozeß
> > schicken.
>
> Dann stirbt der Zombie!

Ein Zombie ist bereits tot. Ein sogenannte Zombie ist im
Grunde genommen kein Prozeß mehr: Der Prozeß wurde bereits
beendet und alle seine Resourcen freigegeben. Das einzige,
was noch übrig ist, ist ein Eintrag im Process-table des
Kernels (daher zeigt ps ihn überhaupt an). Das hat eigent-
lich nur rein formale Gründe: Da der Parent-Prozeß den
Exit-code seines Kindes nicht abgeholt hat, darf dieser
Eintrag nicht verworfen werden. Sobald der Parent das tut,
löscht der Kernel den Eintrag aus der Process-table, und
der Zombie »verschwindet«.

Wenn Du z.B. den Parent killst, dann erbt »init« (PID 1)
seine Kinder und holt deren Exit-codes ab -- auch in diesem
Fall verschwinden dann die Zombies.

> > Übrigens, »ps -alx« verrät Dir auch die PID des
> > Parent,.....

Ich habe übrigens mal ein Skript geschrieben, mit dem man
alle Vorfahren eines Prozesses (bis hin zu init) zurück-
verfolgen kann. Das ist zuweilen sehr nützlich.

http://www.secnetix.de/~olli/scripts/pidtrace

Die Ausgabe sieht dann z.B. so aus:

$ echo $$
51934
$ pidtrace 51934
  UID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND
 1000 51934 51933 1 18 0 2072 1816 pause Ss p8 0:00.34 -zsh (zsh)
    0 51933 267 0 2 0 2456 1560 select S ?? 0:01.06 sshd: olli(at)ttyp8 (sshd)
    0 267 1 0 2 0 2324 584 select Is ?? 10:18.75 /usr/sbin/sshd
    0 1 0 0 10 0 544 72 wait ILs ?? 0:23.49 /sbin/init --

> [...]
> Hier ist glaube ich, das Stueck Code dafuer. Mach mal ein ROTES Haecken
> wenn du'einen Fehler siehste ;-)

Dazu hat ja Bernd schon was geschrieben.

Im Prinzip gibt es drei Möglichkeiten, was ein Programm
machen kann: Entweder, es wartet sofort auf den Child-
Prozeß (mit einer der wait*()-Funktionen). Dies wird üb-
licherweise dann gemacht, wenn das Programm nur mal eben
schnell ein externes Kommando ausführen will.

Die zweite Möglichkeit ist, daß nach dem fork/exec nicht
gewartet wird, sondern das Programm widmet sich anderen
Tätigkeiten. Dies wird i.allg. dann gemacht, wenn ein
Hintergrund-Job gestartet wird, bei dem es dem Programm
egal ist, wie lange der läuft. In diesem Fall muß das
Programm einen Signal-handler für SIGCHLD installieren,
damit es bei der Beendigung der Child-Prozesse benach-
richtigt wird und deren Exit-code in Empfang nehmen kann.
Dies ist das, was Du in Bernds Antwort findest.

Die dritte Möglichkeit liegt dann vor, wenn der Parent-
Prozeß eng mit dem Child zusammenarbeitet und mit ihm
kommuniziert, z.B. über ein socketpair oder eine Pipe.
Wenn sich der Child-Prozeß beendet, merkt es der Parent
daran, daß die Verbindung geschlossen wird, und kann dann
den Exit-code abholen.

Wird keiner dieser drei Wege implementiert, oder nur feh-
lerhaft implementiert, dann führt das zwangsläufig zu
Zombies. Dem Autor sollte man dann den PUE von Stevens
zu Ostern schenken. ;-)

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
I worry about my child and the Internet all the time, even though she's
too young to have logged on yet.  Here's what I worry about.  I worry
that 10 or 15 years from now, she will come to me and say "Daddy, where
were you when they took freedom of the press away from the Internet?"
       -- Mike Godwin
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 26 Mar 2003 - 21:00:47 CET

search this site