20Aug

Hvad er en "Zombie Process" på Linux?

Hvis du er en Linux-bruger, kan du have set zombieprocesser, der springer rundt i din procesliste. Du kan ikke dræbe en zombie proces, fordi den allerede er død - som en faktisk zombie.

Zombier er stort set de resterende bits af døde processer, der ikke er blevet renset korrekt. Et program, der skaber zombieprocesser, er ikke programmeret korrekt - programmer skal ikke lade zombieprocesserne holde fast.

Billedkredit: Daniel Hollister på Flickr( Remixed)

Hvad er en zombieproces?

For at forstå, hvad en zombieproces er, og hvad der forårsager zombieprocesser, skal du forstå lidt om, hvordan processer virker på Linux.

Når en proces dør på Linux, fjernes den ikke alle øjeblikkeligt fra hukommelsen - dens procesbeskrivelse forbliver i hukommelse( procesbeskrivelsen tager kun en lille mængde hukommelse).Processens status bliver EXIT_ZOMBIE, og procesens forælder meddeles, at dens børneproces er død med SIGCHLD-signalet. Hovedprocessen skal derefter udføre ventetiden() systemopkald for at læse den døde process exitstatus og andre oplysninger. Dette gør det muligt for forældreprocessen at få oplysninger fra den døde proces. Efter ventetiden() kaldes zombieprocessen helt væk fra hukommelsen.

Dette sker normalt meget hurtigt, så du kan ikke se, at zombieprocesser akkumuleres på dit system. Men hvis en forældersproces ikke er programmeret korrekt og aldrig kalder vente() , vil dens zombiebørn holde sig fast i hukommelsen, indtil de bliver ryddet op.

Utilities som GNOME System Monitor, top kommandoen og ps kommando display zombie processer.

Farer ved Zombie Processes

Zombie-processer bruger ikke nogen systemressourcer.(Faktisk bruger hver en meget lille mængde systemhukommelse til at gemme sin procesbeskrivelse.) Hver zombieproces bevarer imidlertid sin proces-id( PID).Linux-systemer har et begrænset antal proces-id'er - 32767 som standard på 32-bit-systemer. Hvis zombier akkumuleres med en meget hurtig hastighed - hvis forkert programmeret server software skaber zombieprocesser under belastning - vil hele puljen af ​​tilgængelige PID'er til sidst blive tildelt zombieprocesser, hvilket forhindrer andre processer i at starte.

Et par zombieprocesser, der hænger rundt, er imidlertid ikke noget problem - selvom de angiver en fejl med deres forældelsesproces på dit system.

Afskaffelse af zombieprocesser

Du kan ikke dræbe zombieprocesser, da du kan dræbe normale processer med SIGKILL-signalet - zombieprocesser er allerede døde. Husk på, at du ikke behøver at slippe af med zombieprocesser, medmindre du har meget på dit system - nogle zombier er harmløse. Der er dog nogle få måder, du kan slippe af med zombieprocesser.

En måde er ved at sende SIGCHLD-signalet til overordnet proces. Dette signal fortæller den overordnede proces at udføre vent() systemopkald og rydde op sine zombiebørn. Send signalet med kill -kommandoen, erstatning af pid i kommandoen nedenfor med forældreprocessens PID:

kill -s SIGCHLD pid

Men hvis forældreprocessen ikke er programmeret korrekt og ignorerer SIGCHLD-signaler, vandt detteDet hjælper ikke. Du bliver nødt til at dræbe eller lukke zombiernes overordnede proces. Når processen, der skabte zombierne ender, inverter init zombieprocesserne og bliver deres nye forælder.(init er den første proces startet på Linux ved opstart og tildeles PID 1.) init udfører periodisk ventet() systemopkald for at rydde op sine zombiebørn, så init vil gøre kort arbejde med zombierne. Du kan genstarte hovedprocessen efter at have lukket den.

Hvis en forældreproces fortsætter med at oprette zombier, skal den rettes, så den kalder ordentlig vente() for at høste sine zombiebørn. Send en fejlrapport, hvis et program på dit system fortsætter med at oprette zombier.