Programma's die slecht zijn geschreven of slecht kunnen uitvoeren, kunnen vertrekken zombieprocessen op de loer in je Linux-computer. Ontdek hoe zombies zijn gemaakt en hoe u ze eindelijk kunt laten rusten.
Hoe Proces-staten werken op Linux
Linux moet natuurlijk alle toepassingen en daemons op uw computer bijhouden. Een van de manieren die dit doet, is door de procestabel te handhaven. Dit is een lijst met structuren in het kernelgeheugen. Elk proces heeft een vermelding in deze lijst met wat informatie over het.
Er is geen grote deal in elk van de processtructuren van het proces. Ze houden de Process-ID , een paar andere gegevensitems en een aanwijzer naar het procesbesturingsblok (PCB) voor dat proces.
Het is de PCB die de vele details bevat Linux moet opkijken of ingesteld voor elk proces. De PCB wordt ook bijgewerkt als een proces wordt aangemaakt, gegeven verwerkingstijd en uiteindelijk vernietigd.
De Linux PCB bevat meer dan 95 velden.
Het is gedefinieerd
als een structuur genaamd
task_struct.h
, en het is meer dan 700 regels lang. De PCB bevat de volgende soorten informatie:
- Processtaat : De staten worden hieronder beschreven.
- Procesnummer : De unieke identifier binnen het besturingssysteem.
- Programmateller : Wanneer dit proces de volgende toegang tot de CPU is, zal het systeem dit adres gebruiken om de volgende instructie van het proces te vinden dat moet worden uitgevoerd.
- Registers : De lijst met CPU-registers die door dit proces worden gebruikt. De lijst kan accumulatoren, indexregisters en stapelwijzers bevatten.
- Open bestandslijst : Bestanden in verband met dit proces.
- CPU-planningsinformatie : Gebruikt om te bepalen hoe vaak, en voor hoe lang, CPU-verwerkingstijd wordt toegekend aan dit proces. De prioriteit van het proces, de aanwijzingen tot het plannen van wachtrijen en andere planningsparameters moeten in de PCB worden vastgelegd.
- Geheugenbeheerinformatie : Details over het geheugen Dit proces gebruikt, zoals de start- en eindadressen van het procesgeheugen en de aanwijzingen op 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 hardloop- of runnable-proces. Wennende betekenis Het ontvangt CPU-cycli en het uitvoeren. Een runnable-proces is klaar om te rennen en te wachten op een CPU-slot.
- S: Een slaapproces. Het proces wacht op een actie om te voltooien, zoals een in- of uitgangsbewerking, of voor een resource om beschikbaar te zijn.
- NS: Het proces bevindt zich in een ononderbroken slaapstatus. Het gebruikt een blokkeersysteemoproep en kan niet doorgaan totdat de systeemgesprekken zijn voltooid. In tegenstelling tot de "Sleep" -staat, reageert een proces in deze toestand niet op signalen totdat de systeemoproep is voltooid en de uitvoering is teruggekeerd naar het proces.
-
T:
Het proces is beëindigd (gestopt) omdat het de
Sigstopsignaal. Het zal alleen reageren naar deSigkillofSigcontsignalen, die het proces doden of instrueren om respectievelijk door te gaan. Dit is wat er gebeurt als je ruilt voorgrond (fg) tot achtergrond (BG)taken. -
Z:
Een zombieproces. Wanneer een proces is voltooid, verdwijnt het niet alleen. Het bevrijdt elk geheugen dat het gebruikt en verwijdert zichzelf uit het geheugen, maar de invoer in de procestafel en de PCB blijven. De staat is ingesteld op
Exit_zombieen het ouderproces wordt op de hoogte gebracht (door deSigchldsignaal) dat het kindproces is voltooid.
In de Zombie-staat noemt het ouderproces een van de
wacht()
Functies van functies
wanneer het kindproces is gemaakt. Vervolgens wacht het op een staatsverandering in het kindproces. Is het kindproces gestopt, voortgezet of gedood door een signaal? Is het beëindigd door de natuurlijke voltooiing van zijn code te doorlopen?
Als de statuswijziging een is die betekent dat het kindproces is gestopt, wordt de exit-code gelezen. Vervolgens wordt de PCB van het kind vernietigd en is de invoering in de procestabel verwijderd. Idealiter gebeurt dit allemaal in een oogwenk, en processen in de zombiestaat bestaan niet erg lang.
VERWANT: Hoe te rennen en achtergrondprocessen op Linux
Wat veroorzaakt zombieprocessen op Linux?
Een slecht geschreven ouderproces kan de
wacht()
functie wanneer het kindproces is gemaakt. Dit betekent dat er niets waakt voor veranderingen in de staat in het kindproces, en de
Sigchld
signaal wordt genegeerd. Of misschien beïnvloedt een andere toepassing de uitvoering van het ouderproces, hetzij vanwege slechte programmering of kwaadwillende intentie.
Als het ouderproces echter niet naar de veranderingen in de staat in het kinderproces bekijkt, zal het juiste systeemwoning niet voorkomen. De PCB en het item in de procestabel worden niet verwijderd wanneer het kindproces beëindigt. Dit resulteert in de Zombie-staat die nooit uit de PCB wordt verwijderd.
Zombies gebruiken een beetje geheugen, maar ze vormen meestal geen probleem. De invoer in de procestafel is klein, maar totdat het vrijgegeven is, kan het proces-ID niet opnieuw worden gebruikt. Op een 64-bits besturingssysteem, dat is onwaarschijnlijk dat het onwaarschijnlijk is dat de PCB veel groter is dan het proces van de procestabel.
Een groot aantal zombies kan, denkbaar, van invloed zijn op de hoeveelheid geheugen die gratis is voor andere processen. Als je dat veel zombies hebt, heb je echter een serieus probleem met de moedertoepassing of een bedieningssysteem.
Hoe zombie-processen te verwijderen
Je kunt een zombieproces niet doden omdat het al dood is. Het zal niet reageren op signalen omdat het uit het geheugen is verwijderd - er is nergens om een te verzenden
Sigkill
signaal. Je kunt proberen het verzenden van de
Sigchld
Signaal naar het ouderproces, maar als het niet werkte toen het kindproces beëindigd, is het waarschijnlijk niet, ook.
De enige betrouwbare oplossing is om het ouderproces te doden. Wanneer het is beëindigd, worden de kindprocessen geërfd door de
in het
Proces, dat is het eerste proces dat wordt uitgevoerd in een Linux-systeem (het proces-ID is 1).
De
in het
Het proces voert regelmatig de nodige opruimen van zombies uit, dus om ze te doden, moet je gewoon het proces doden dat ze heeft gemaakt. De
bovenkant
opdracht is een handige manier om te zien of u zombies hebt.
Typ het volgende:
Top
Dit systeem heeft acht zombieprocessen. We
kan deze vermelden
Door de
ps
opdracht
en leidt het in
egrep
. Nogmaals, zombie-processen hebben een vlag van de staat van "Z" en zul je meestal ook "overlijden" zien.
Typ het volgende:
PS AUX | egrep "Z | Defunct"
De zombieprocessen worden vermeld.
Dit is een netweg om de proces-ID's van zombies te ontdekken dan heen en weer door te gaan
bovenkant
. We zien ook dat een applicatie "badprg" deze zombies heeft genoemd.
De proces-ID van de eerste zombie is 7641, maar we moeten het proces-ID van zijn ouderproces vinden. We kunnen dit doen door te gebruiken
opnieuw. We gebruiken de uitvoeroptie (
ps
-O
) vertellen
ps
om alleen het proces-ID van de ouder weer te geven en vervolgens door te geven met de
ppid =
vlag.
Het proces dat we willen vinden, worden aangegeven met behulp van de
-P
(Process) optie en passeert vervolgens het proces-ID van de zombie.
Daarom typen we de volgende opdracht om de procesinformatie op te zoeken voor proces 7641, maar het zal alleen de ID van het ouderproces rapporteren:
PS -O PPID = -P 7641
We zijn verteld dat de Ouderproces-ID 7636 is. We kunnen dit nu verwezen worden door dit te gebruiken
ps
nog een keer.
We zien dit overeenkomt met de naam van het ouderproces van eerder. Om het ouderproces te doden, gebruik dan de optie Sigkill met de Kill-opdracht als volgt:
Kill -Sigkill 7636
Afhankelijk van de eigenaar van het ouderproces, moet u mogelijk ook gebruiken
sudo
.
Zombies zijn niet eng ...
... tenzij ze in een massale horde zijn. Enkelen zijn er niet meer zorgen over en een eenvoudige herstart wordt ze weggegaan.
Als u echter merkt dat een toepassing of proces altijd pawning zombies is, is dat iets waar u in moet kijken. Het is waarschijnlijk een slordig geschreven programma, in welk geval, misschien is er een bijgewerkte versie die op de juiste manier opruimt na zijn kindprocessen.