En zombieprocess i Linux hänvisar till de redan döda processerna men på ett eller annat sätt finns de fortfarande i processtabellen i systemet. Klyftan är att denna process av någon anledning inte rensades av föräldern från processtabellen. Vanligtvis händer detta när genomförandeprocessen är klar.
Det vanliga sättet att fungera i Linux är att när en process har slutfört sin körning, meddelar den sin förälder, som är ansvarig för att ta bort processen från tabellen. Tyvärr kan föräldern inte ta bort processen från minnet i de fall föräldern inte kan läsa barnets status. Så här blir det att vi har döda processer i processtabellen. Det här är vad vi kallar zombieprocesserna.
Vad orsakar Linux Zombie-processer?
När barnprocessen skapas kan en dåligt skriven föräldraprocess misslyckas med att anropa funktionen wait (). Som ett resultat kommer dess zombiebarn att dröja kvar i minnet tills de slocknar.
Detta innebär att ingenting övervakar spädbarnsprocessen för tillståndsförändringar och SIGCHLD-signalen kommer att ignoreras. Kanske stör en annan applikation den överordnade processens exekvering, antingen genom elak programmering eller skadlig avsikt.
Korrekt systemhushållning kommer inte att ske om den överordnade processen inte tittar på tillståndsförändringar i barnprocessen.
När spädbarnsprocessen är klar kommer PCB och posten i procestabellen inte att tas bort. Zombietillståndet tas aldrig bort från PCB som ett resultat av detta.
Zombier har lite minne, men det är vanligtvis inte ett problem. Eftersom Linux-system har ett begränsat antal PID: er (om än ett stort antal), om tillräckligt med PID är zombied, kan ingen annan process starta. Det är tveksamt om detta kommer att hända.
Men zombied processer tyder på att något har gått fel med en applikation och att ett specifikt program kan ha en bugg.
Programvarufel i datacenter ska inte tolereras och måste åtgärdas.
Du bör hålla ett öga på och förstöra zombieprocesser tills felet är åtgärdat.
Process-ID: t kan inte återanvändas förrän det startas, så processtabellens post är liten.
Eftersom kretskortet är mycket större än processtabellens inmatning i ett 64-bitars operativsystem, är det osannolikt att det orsakar några problem.
Mängden minne tillgängligt för andra processer kan påverkas av ett stort antal zombier. Men om du har så många zombies har du ett allvarligt problem med den överordnade applikationen eller ett fel i operativsystemet.
Så vad gör du när ett förfarande blir en zombie? Du spårar och eliminerar zombieprocesserna.
Hur man hittar en zombieprocess?
Det första stoppet för att döda en zombieprocess i systemet är först att identifiera den. Eftersom init-processen städas upp efter zombies regelbundet, är allt du behöver göra för att bli av med dem att förstöra processen som skapade dem.
Det översta kommandot är ett snabbt sätt att se om det finns några zombier i ditt område. För att uppnå detta kommer vi att utföra följande kommando.
topp
Antalet zombieprocesser i detta system visas på utdata. I vårt fall ovan har vi 0 zombies.
Med hjälp av kommandot ps och rör det till egrep kan vi få en lista över dem. Statens flagga för zombieprocesser är "Z" och ibland kommer du också att se "nedlagda".
tuts @ fosslinux: ~ $ ps aux | egrep "Z | defunct"
Låt oss bryta ner de olika delarna av detta kommando.
Z i STAT-kolumnen i utdata identifierar en zombieprocess.
[defunct] i den sista (COMMAND) kolumnen i utdata identifierar också en zombie-process.
Helst är det inte möjligt att döda en Zombie-process eftersom den är död. Istället meddelar vi föräldern att försöka läsa barnets processstatus och slutligen rengöra dem från systemets bord. För att utlösa denna process skickar vi en SIGCHLD-signal till processens förälder. Att identifiera det överordnade process-ID: n eller vad som kallas PID innebär att du kör följande kommando:
tuts @ fosslinux: ~ $ ps -o ppid =
Efter att ha fått Zombie's PID, använd kommandot SIGCHLD-signal till de tidigare identifierade överordnade processerna.
tuts @ fosslinux: ~ $ kill -s SIGCHLD
I vissa fall rensas inte Zombie-processen. Detta kallar oss att delta i plan b eller c. Det föregående innebär att man startar om föräldraprocessen eller dödar föräldrarna. Å andra sidan handlar de senare fallen om att starta om systemet, särskilt när Zombie-processen kan orsaka ett avbrott eller en massiv ökning på grund av Zombie-processen.
Nedan finns kommandot att döda föräldraprocessen.
tuts @ fosslinux: ~ $ kill -9
Om en föräldraprocess dödas dödas också alla föräldrarnas barnprocesser. Om en av barnprocesserna är kritisk vid en viss tidpunkt kan du behöva skjuta upp dödandet tills det är säkert. Å andra sidan kan en snabb dubbelkontroll berätta hur mycket minne eller processorkraft Zombie-processerna förbrukar. Detta hjälper till att avgöra om det bättre alternativet är att döda moderprocessorn för att göra omstart av systemet i följande cykel av systemunderhållet som redan är schemalagt.
På Linux, hur fungerar processtillstånd?
Naturligtvis måste Linux hålla reda på alla applikationer och demoner som körs på din dator. Att underhålla processtabellen är ett av sätten att uppnå detta.
Detta är en lista över kärnminnestrukturer. Denna lista innehåller en post för varje process som innehåller lite information om den. Var och en av processtabellstrukturerna innehåller väldigt lite information.
De lagrar process-ID, några andra bitar av information och en pekare till processkontrollblocket (PCB).
PCB är där Linux lagrar all information den behöver för att leta upp eller ställa in för varje process. När en process skapas modifieras den, ges bearbetningstid och förstörs sedan.
Det finns över 95 fält på Linux PCB. Det definieras i uppgiftsstrukturen, som är över 700 linjer lång. Följande typer av information finns på PCB:
Processens tillstånd illustreras nedan
- Processnummer: Operativsystemets distinkta identifierare.
- Programräknare: När denna process får åtkomst till CPU igen kommer systemet att använda denna adress för att hitta nästa instruktion om processen som ska köras.
- Register: Denna procedur använder en lista över CPU-register som kallas register. Ackumulatorer, indexregister och stackpekare kan finnas i listan.
- Öppna fillista: Filer som är associerade med denna procedur ingår i listan Öppna fil.
- CPU-schemaläggningsinformation: Används för att beräkna hur ofta och hur länge denna process tar emot CPU-behandlingstid.
PCB måste registrera processprioritet, pekare till schemaläggningsköer och andra schemaläggningsparametrar. - Information om minneshantering: Information om minnet som denna process använder, till exempel processminnets start- och slutadresser, samt pekare till minnessidor.
- Information om I / O-status: Alla enheter som processen använder som in- eller utgångar.
Något av följande kan vara "Processstatus":
- R: En körning eller en körbar process. Det körs, vilket betyder att det hämtar och kör CPU-cykler.
Ett förfarande som är klart att köras väntar på en CPU-plats. - S: Sova.
Processen väntar på att en åtgärd ska slutföras, t.ex. en in- eller utmatning. Eller en resurs tillgänglighet. - D: Förfarandet är i ett tillstånd av icke-avbrytbar sömn. Det använder ett blockerande systemanrop, vilket innebär att det inte fortsätter förrän systemanropen har slutförts. Till skillnad från tillståndet "Viloläge" svarar en process i detta tillstånd inte på signaler förrän systemanropet är slutfört och körningen har återgått till processen.
- T: Eftersom den fick SIGSTOP-signalen har processen avslutats (stoppas).
Den svarar bara på SIGKILL- eller SIGCONT-signalerna, antingen dödar eller instruerar processen att fortsätta. När du byter från förgrundsuppgifter (fg) till bakgrundsuppgifter (bg) händer detta. - Z: står för Zombie Process. När en process är klar försvinner den inte bara. Istället frigör det allt minne som det för närvarande använder och avslutar minne, men dess processtabellinmatning och PCB kvar.
Dess tillstånd är inställt på EXIT ZOMBIE, och dess överordnade process får veta att spädbarnsprocessen har slutförts via SIGCHLD-signalen.
Slutsats
Såvida de inte är en del av en stor hord, är Zombies inte så skadliga. Några är inte en stor sak, och en snabb omstart kommer att rensa dem. Det finns dock en sak att tänka på.
Linux-arkitekturer har ett maximalt antal processer och som ett resultat ett maximalt antal process-ID-nummer. När en dators maximala antal zombieprocesser uppnås kan nya processer inte startas.
Zombieprocesser är inte processer; de är resterna efter döda processer som deras föräldraprocess inte har rensat korrekt. Men om du märker att en viss applikation eller process ständigt leker zombier, bör du undersöka det vidare.
Troligtvis är det bara ett dåligt skrivet program; i så fall kanske det finns en uppdaterad version som rensar upp efter att barnet har behandlat ordentligt.