Hjemmeside » hvordan » Hva er en Zombie-prosess på Linux?

    Hva er en Zombie-prosess på Linux?

    Hvis du er en Linux-bruker, kan det hende du har sett zombieprosesser som springer rundt prosesslisten din. Du kan ikke drepe en zombie-prosess fordi den allerede er død - som en faktisk zombie.

    Zombier er i utgangspunktet de resterende biter av døde prosesser som ikke har blitt renset opp riktig. Et program som skaper zombieprosesser, er ikke programmert riktig - programmene er ikke ment å la zombieprosesser holde seg fast.

    Bilde Kreditt: Daniel Hollister på Flickr (Remixed)

    Hva er en Zombie-prosess?

    For å forstå hva en zombieprosess er, og hva som fører til at zombieprosesser vises, må du forstå litt om hvordan prosesser fungerer på Linux.

    Når en prosess dør på Linux, fjernes det ikke umiddelbart fra minnet - prosessbeskrivelsen forblir i minnet (prosessbeskrivelsen tar bare en liten mengde minne). Prosessens status blir EXIT_ZOMBIE og prosessens foreldre blir varslet om at barnprosessen har døde med SIGCHLD-signalet. Den overordnede prosessen skal da utføre ventetiden () systemanrop for å lese dødsprosessens utgangsstatus og annen informasjon. Dette gjør det mulig for foreldreprosessen å få informasjon fra den døde prosessen. Etter ventetiden () kalles zombieprosessen helt fra minnet.

    Dette skjer vanligvis veldig raskt, slik at du ikke ser at zombieprosesser akkumulerer på systemet ditt. Men hvis en foreldreprosess ikke er programmert riktig og aldri ringer vente (), vil zombiebarnene holdes fast i minnet til de blir ryddet opp.

    Verktøy som GNOME System Monitor, the topp kommando og ps kommando skjerm zombie prosesser.

    Farene ved Zombie Prosesser

    Zombie-prosesser bruker ikke noen systemressurser. (Egentlig bruker hver en veldig liten mengde systemminne for å lagre prosessbeskrivelsen.) Hver zombieprosess beholder imidlertid sin prosess ID (PID). Linux-systemer har et begrenset antall prosess-ID-er - 32767 som standard på 32-bits systemer. Hvis zombier samler seg i en meget rask takt - for eksempel hvis feilprogrammert serverprogramvare skaper zombieprosesser under belastning - vil hele bassenget av tilgjengelige PIDs til slutt bli tildelt zombieprosesser, slik at andre prosesser ikke starter.

    Men noen zombieprosesser som henger rundt er ikke noe problem - selv om de tyder på en feil med foreldreprosessen på systemet ditt.

    Bli kvitt Zombie Prosesser

    Du kan ikke drepe zombieprosesser som du kan drepe normale prosesser med SIGKILL-signalet - Zombie-prosesser er allerede døde. Husk at du ikke trenger å bli kvitt zombieprosesser hvis du ikke har mye på systemet ditt - noen få zombier er ufarlige. Det er imidlertid noen måter du kan kvitte seg med zombieprosesser.

    En måte er å sende SIGCHLD-signalet til overordnet prosess. Dette signalet forteller overordnet prosessen for å utføre ventetiden () systemanrop og rydde opp sine zombiebarn. Send signalet med drepe kommando, erstatning pid i kommandoen nedenfor med foreldreprosessens PID:

    drepe -s SIGCHLD pid

    Men hvis foreldreprosessen ikke er programmert riktig og ignorerer SIGCHLD-signaler, vil dette ikke hjelpe. Du må drepe eller lukke zombierens foreldreprosess. Når prosessen som opprettet zombiene ender, init arver zombieprosessen og blir deres nye forelder. (init er den første prosessen startet på Linux ved oppstart og tildeles PID 1.) init utfører periodisk ventetiden () systemanrop for å rydde opp sine zombiebarn, så init vil gjøre kort arbeid av zombiene. Du kan starte oppstartsprosessen etter å ha lukket den.

    Hvis en forelderprosess fortsetter å lage zombier, bør den lages slik at den riktig kalles vente () for å høste sine zombiebarn. Fil en feilrapport hvis et program på systemet ditt fortsetter å lage zombier.