Zombie-prosessi

Linux.fista
(Ohjattu sivulta Zombie)
Siirry navigaatioon Siirry hakuun

Zombie-prosessi on prosessi, joka on lopettanut suorituksen, mutta on yhä prosessitaulussa. Zombie-prosessit ovat eläviä kuolleita, mistä metafora Zombie on alun perin nimeksi annettu.

Prosessin päättyessä sen resurssit vapautetaan muiden prosessien käyttöön. Prosessi kuitenkin säilyy prosessitaulussa, jotta äitiprosessi voi lukea sen paluuarvon wait()-järjestelmäkutsulla. wait()-järjestelmäkutsun yhteydessä prosessin tunnistenumero vapautetaan, jotta se voidaan käyttää myöhemmin uudelleen. Mikäli prosessin vanhempi ei koskaan suorita wait()-järjestelmäkutsua, jää lapsiprosessi roikkumaan järjestelmään ja siitä tulee zombie.

Zombien etsiminen[muokkaa]

Zombie-prosesseja voidaan etsiä ps- ja grep-ohjelmien avulla.

$ ps axo user,pid,ppid,command,s | grep -w Z$

Zombien poistaminen[muokkaa]

Zombie-prosessia ei voida tappaa, koska se on jo kuollut. Zombie-prosessit voidaan kuitenkin poistaa järjestelmästä lähettämällä niiden äitiprosessille SIGCHLD-signaali.

$ kill -CHLD <vanhemman_PID>

Toisinaan vanhempi ei kuitenkaan suostu kuuntelemaan signaalia, vaan se täytyy kylmästi tappaa. Tässä tapauksessa zombie-prosessi jää orvoksi ja se siirretään init-prosessin (PID 1) lapseksi. init siivoaa säännöllisin väliajoin sen lapsina olevat zombie-prosessit.

Zombien luominen[muokkaa]

Zombie-prosesseja voidaan luoda C-kielellä esimerkiksi näin:

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

int main(void)
{
    pid_t p;
    for (;;) {
        p = fork();
        if (p > 0)
            sleep(1);
        else
            exit(0);
    }
    return 0;
}