
Programma’s die slecht zijn geschreven of slecht presteren, kunnen zombieprocessen achterlaten op uw Linux-computer. Ontdek hoe zombies worden gemaakt en hoe u ze eindelijk kunt laten rusten.
Hoe processtatussen werken op Linux
Linux moet natuurlijk alle applicaties en daemons bijhouden die op uw computer draaien. Een van de manieren waarop het dit doet, is door de procestabel bij te houden. Dit is een lijst met structuren in het kernelgeheugen. Elk proces heeft een vermelding in deze lijst met wat informatie erover.
Er is niet veel in elk van de procestabelstructuren. Ze bevatten de proces-ID, een paar andere gegevensitems en een wijzer naar het procesbesturingsblok (PCB) voor dat proces.
Het is de printplaat die de vele details bevat die Linux voor elk proces moet opzoeken of instellen. De printplaat wordt ook bijgewerkt als een proces wordt gemaakt, de verwerkingstijd krijgt en uiteindelijk wordt vernietigd.
De Linux PCB bevat meer dan 95 velden. Het wordt gedefinieerd als een structuur genaamd task_struct.h, en het is meer dan 700 regels lang. De printplaat bevat de volgende soorten informatie:
- Processtatus: De staten worden hieronder beschreven.
- Procesnummer: De unieke identificatie binnen het besturingssysteem.
- Programmateller: Wanneer dit proces de volgende keer toegang krijgt tot de CPU, zal het systeem dit adres gebruiken om de volgende instructie van het proces te vinden dat moet worden uitgevoerd.
- Registreert: De lijst met CPU-registers die door dit proces worden gebruikt. De lijst kan accumulatoren, indexregisters en stapelaanwijzers bevatten.
- Open bestandslijst: Bestanden die aan dit proces zijn gekoppeld.
- CPU-planningsinformatie: Wordt gebruikt om te bepalen hoe vaak en hoelang de CPU-verwerkingstijd aan dit proces wordt toegekend. De prioriteit van het proces, verwijzingen naar planningswachtrijen en andere planningsparameters moeten op de printplaat worden vastgelegd.
- Geheugenbeheerinformatie: Details over het geheugen dat dit proces gebruikt, zoals de start- en eindadressen van het procesgeheugen, en verwijzingen naar de geheugenpagina’s.
- I / O-statusinformatie: Alle in- of uitvoerapparaten die door het proces worden gebruikt.
De “Processtatus” kan een van de volgende zijn:
- R: Een lopend of uitvoerbaar proces. Running betekent dat het CPU-cycli ontvangt en wordt uitgevoerd. Een uitvoerbaar proces is klaar om uit te voeren en wacht op een CPU-slot.
- S: Een slaapproces. Het proces wacht op een actie die is voltooid, zoals een invoer- of uitvoerbewerking, of op het beschikbaar komen van een bron.
- D: Het proces bevindt zich in een ononderbroken slaapstand. Het gebruikt een blokkerende systeemoproep en kan pas doorgaan als de systeemoproepen zijn voltooid. In tegenstelling tot de slaapstand reageert een proces in deze toestand pas op signalen als de systeemoproep is voltooid en de uitvoering is teruggekeerd naar het proces.
-
T: Het proces is beëindigd (gestopt) omdat het de
SIGSTOPsignaal. Het reageert alleen op deSIGKILLofSIGCONTsignalen, die het proces beëindigen of het opdracht geven om door te gaan. Dit is wat er gebeurt als je van voorgrond wisselt (fg) naar de achtergrond (bg)taken. -
Z: Een zombieproces. Wanneer een proces is voltooid, verdwijnt het niet zomaar. Het maakt elk geheugen dat het gebruikt vrij en verwijdert zichzelf uit het geheugen, maar de invoer in de procestabel en PCB blijft. De staat is ingesteld op
EXIT_ZOMBIE, en het bovenliggende proces wordt gemeld (door deSIGCHLDsignaal) dat het kindproces is voltooid.
In de status Zombie roept het bovenliggende proces een van de wait() families van functies wanneer het onderliggende proces wordt gemaakt. Het wacht dan op een toestandverandering in het kindproces. Is het kindproces gestopt, voortgezet of gestopt door een signaal? Is het beëindigd door de natuurlijke voltooiing van zijn code te doorlopen?
Als de statuswijziging er een is die betekent dat het onderliggende proces is gestopt, wordt de afsluitcode gelezen. Vervolgens wordt de printplaat van het kind vernietigd en wordt de invoer in de procestabel verwijderd. Idealiter gebeurt dit allemaal in een oogwenk, en processen in de zombietoestand bestaan niet erg lang.
VERWANT: Achtergrondprocessen uitvoeren en besturen op Linux
Wat veroorzaakt zombieprocessen op Linux?
Een slecht geschreven ouderproces kan het wait() functie wanneer het onderliggende proces wordt gemaakt. Dit betekent dat niets let op toestandsveranderingen in het kindproces, en de SIGCHLD signaal wordt genegeerd. Of misschien heeft een andere toepassing invloed op de uitvoering van het bovenliggende proces, hetzij vanwege een slechte programmering of door kwaadwillende bedoelingen.
Als het bovenliggende proces echter niet let op statusveranderingen in het onderliggende proces, zal de juiste systeemhuishouding niet plaatsvinden. De printplaat en de invoer in de procestabel worden niet verwijderd wanneer het onderliggende proces wordt beëindigd. Hierdoor wordt de zombiestatus nooit van de print verwijderd.
Zombies gebruiken wel een beetje geheugen, maar ze vormen meestal geen probleem. De vermelding in de procestabel is klein, maar totdat deze wordt vrijgegeven, kan de proces-ID niet opnieuw worden gebruikt. Op een 64-bits besturingssysteem is het onwaarschijnlijk dat dit problemen veroorzaakt, omdat de printplaat veel groter is dan de vermelding in de procestabel.
Een groot aantal zombies zou, denkbaar, de hoeveelheid geheugen kunnen beïnvloeden die vrij is voor andere processen. Als je echter zoveel zombies hebt, heb je een serieus probleem met de bovenliggende applicatie of een bug in het besturingssysteem.
Zombieprocessen verwijderen
Je kunt een zombieproces niet doden omdat het al dood is. Het reageert niet op signalen omdat het uit het geheugen is verwijderd. Er kan nergens een SIGKILL signaal. U kunt proberen het SIGCHLD signaal naar het bovenliggende proces, maar als het niet werkte toen het onderliggende proces werd beëindigd, is het onwaarschijnlijk dat het nu ook werkt.
De enige betrouwbare oplossing is om het ouderproces te beëindigen. Wanneer het wordt beëindigd, worden de onderliggende processen geërfd door de init process, het eerste proces dat in een Linux-systeem wordt uitgevoerd (de proces-ID is 1).
De init process voert regelmatig de nodige opruiming van zombies uit, dus om ze te doden, hoef je alleen maar het proces te doden dat ze heeft gemaakt. De top commando is een handige manier om te zien of je zombies hebt.
Typ het volgende:
top

Dit systeem heeft acht zombieprocessen. We kunnen deze opsommen door de ps commando en leid het naar egrep. Nogmaals, zombieprocessen hebben de vlag van de staat ‘Z’ en je ziet meestal ook ’ter ziele’.
Typ het volgende:
ps aux | egrep "Z|defunct"

De zombieprocessen worden vermeld.

Dit is een leukere manier om de proces-ID’s van zombies te ontdekken dan door heen en weer te scrollen top. We zien ook dat een applicatie genaamd “badprg” deze zombies heeft voortgebracht.
De proces-ID van de eerste zombie is 7641, maar we moeten de proces-ID van het bovenliggende proces vinden. We kunnen dit doen door gebruik te maken van nog een keer. We gebruiken de uitvoeroptie (ps-o) vertellen ps om alleen de proces-ID van de ouder weer te geven en deze vervolgens door te geven met de ppid= vlag.
Het proces dat we willen vinden, wordt aangegeven met de -p (proces) optie, en vervolgens de proces-ID van de zombie doorgeven.
Daarom typen we de volgende opdracht om de procesinformatie voor proces 7641 op te zoeken, maar het zal alleen de ID van het bovenliggende proces rapporteren:
ps -o ppid= -p 7641

Er is ons verteld dat de ID van het bovenliggende proces 7636 is. We kunnen hier nu naar verwijzen met behulp van ps nog een keer.

We zien dat dit overeenkomt met de naam van het ouderproces van eerder. Om het bovenliggende proces te beëindigen, gebruikt u de SIGKILL-optie met het kill-commando als volgt:
kill -SIGKILL 7636
Afhankelijk van de eigenaar van het bovenliggende proces, moet u mogelijk ook gebruiken sudo.
Zombies zijn niet eng …
… tenzij ze in een enorme horde zitten. Een paar zijn niets om je zorgen over te maken en een simpele herstart zal ze wegvagen.
Als je echter merkt dat een applicatie of proces altijd zombies voortbrengt, moet je daar naar kijken. Het is hoogstwaarschijnlijk gewoon een slordig geschreven programma, in welk geval er misschien een bijgewerkte versie is die goed wordt opgeruimd nadat de onderliggende processen zijn voltooid.