Programmer, der er dårligt skrevet eller udfører dårligt, kan forlade zombie processer. lurker inde i din Linux computer. Find ud af, hvordan zombier er skabt, og hvordan du endelig kan lægge dem til hvile.
Hvordan processtaterne arbejder på Linux
Linux skal selvfølgelig holde styr på alle applikationer og dæmoner, der kører på din computer. En af de måder, det gør dette på, er ved at opretholde procesbordet. Dette er en liste over strukturer i kernel hukommelse. Hver proces har en post i denne liste, der indeholder nogle oplysninger om det.
Der er ikke en hel del i hver af procesbordsstrukturerne. De holder proces ID. , et par andre dataelementer og en peger til processtyringsblokken (PCB) for denne proces.
Det er PCB, der holder de mange detaljer Linux, der skal kigge op eller sætte for hver proces. PCB'en opdateres også som en proces er skabt, givet behandlingstid og endelig ødelagt.
Linux PCB indeholder over 95 felter.
Det er defineret
som en struktur kaldet
task_struct.h.
, og det er over 700 linjer langt. PCB'en indeholder følgende typer oplysninger:
- Processtatus : Staterne er beskrevet nedenfor.
- Proces nummer. : Dens unikke identifikator inden for operativsystemet.
- Program tæller. : Når denne proces er næste givet adgang til CPU'en, vil systemet bruge denne adresse til at finde den næste instruktion af den proces, der skal udføres.
- Registre. : Listen over CPU-registre, der anvendes ved denne proces. Listen kan indeholde akkumulatorer, indekskregister og stakke pointers.
- Åbn filliste : Filer i forbindelse med denne proces.
- CPU planlægning information : Bruges til at bestemme, hvor ofte, og for hvor lang tid er CPU-behandlingstid tildelt denne proces. Prioriteten af processen, pointers til planlægning af køer og andre planlægningsparametre skal registreres i PCB.
- Memory Management Information : Detaljer om hukommelsen Denne proces bruger, f.eks. Start- og slutadresserne på proceshukommelsen og peger på hukommelsessiderne.
- I / O-statusoplysninger : Eventuelle in- eller output-enheder, der anvendes af processen.
"Process State" kan være et af følgende:
- : En løbende eller løbelig proces. Running betyder det modtager CPU-cykler og udførelse. En løbelig proces er klar til at køre og vente på en CPU-slot.
- S: En sovende proces. Processen venter på en handling for at fuldføre, såsom en in- eller output operation, eller for en ressource, der skal foreligges.
- D: Processen er i en uafbrydelig søvntilstand. Det bruger et blokeringssystemopkald og kan ikke fortsætte, indtil systemopkaldene har gennemført. I modsætning til "søvn" tilstand vil en proces i denne tilstand ikke reagere på signaler, indtil systemopkaldet er afsluttet, og udførelsen er vendt tilbage til processen.
-
T:
Processen er afsluttet (stoppet), fordi den modtog
SIGSTOP.signal. Det vil kun svare tilSigkill.ellerSigcont.signaler, som enten dræber processen eller instruerer den til at fortsætte henholdsvis. Dette er hvad der sker, når du bytter fra forgrunden (FG.) til baggrund (bg)opgaver. -
Z:
En zombie proces. Når en proces fuldender, forsvinder den ikke bare. Det frigør enhver hukommelse, den bruger og fjerner sig fra hukommelsen, men dets indgang i procesbordet og PCB forbliver. Dens stat er indstillet til
Exit_zombie., og dens moderselskab er anmeldt (afSigchld.signal), at barnets proces er færdig.
I zombiestaten kalder moderprocessen en af de
vente()
Funktioner af funktioner
når barnet processen er oprettet. Det venter derefter til en tilstandsændring i barnets proces. Har barnet processen blevet stoppet, fortsætter, eller dræbt af et signal? Har det afsluttes ved at køre gennem den naturlige afslutning af sin kode?
Hvis staten ændring er en, der betyder at barnet processen er stoppet, er dens exitkode læse. Derefter barnets PCB ødelagt og den træder i processen tabellen er fjernet. Ideelt set alt dette sker i løbet af et øjeblik, og processer i zombie tilstand eksisterer ikke for meget længe.
RELATEREDE: Sådan Run og Kontrol Baggrund Processer på Linux
Hvad er årsagen Zombie Processer på Linux?
En dårligt skrevet forælder proces kan ikke kalde
vente()
fungere, når barnet processen er oprettet. Dette betyder intet er at se for statslige ændringer i barnet processen, og den
Sigchld.
signalet vil blive ignoreret. Eller, er måske et andet program, der påvirker udførelsen af den overordnede proces, enten på grund af dårlig programmering eller ondsindede hensigter.
Men hvis den overordnede proces ikke er at se for statslige ændringer i barnet processen, den rette systemet husholdning vil ikke forekomme. PCB og posten i processen tabellen, vil ikke blive fjernet, når barnet processen afsluttes. Dette resulterer i zombie tilstand aldrig fjernes fra PCB.
Zombier bruger en smule hukommelse, men de normalt ikke udgøre et problem. Punktet i processen tabellen er lille, men, indtil den udgives, kan processen id ikke genbruges. På en 64-bit operativsystem, der er usandsynligt at forårsage nogen problemer, fordi PCB er langt større end tilmeldingsprocessen bordet.
Et stort antal af zombier kunne tænkes, påvirke mængden af hukommelse, der er gratis for andre processer. Hvis du har fået at mange zombier, selv om, du har fået et alvorligt problem med den forælder program eller et operativsystem fejl.
Sådan fjernes Zombie Processer
Du kan ikke dræbe en zombie proces, fordi det er allerede død. Det vil ikke reagere på nogen signaler, fordi det er blevet fjernet fra hukommelsen-der er ingen steder at sende
Sigkill.
signal. Du kan prøve at sende
Sigchld.
signal til den overordnede proces, men hvis det ikke virkede, når barnet processen afsluttes, er det usandsynligt at arbejde nu, enten.
Den eneste pålidelige løsning er at dræbe den overordnede proces. Når det er afsluttet, er dens underordnede processer arvet af den
i det
proces, som er den første proces til at køre på et Linux system (sin proces ID er 1).
Det
i det
proces udfører jævnligt den nødvendige oprydning af zombier, så for at dræbe dem, du bare nødt til at dræbe den proces, der skabte dem. Det
top
kommando er en bekvem måde at se, hvis du har nogen zombier.
Skriv følgende:
top
Dette system har otte zombie processer. Vi
kan liste disse
ved hjælp af
ps
kommando
og rørsystemer det ind
egrep
. Igen, zombie processer har en tilstand flag ”Z”, og du vil som regel også se ”hedengangne”.
Skriv følgende:
ps aux | egrep "Z | hedengangne"
De zombie processer er noteret.
Dette er en pænere måde at opdage den proces ID'er af zombier end at rulle frem og tilbage gennem
top
. Vi ser også, at et program kaldet ”badprg” affødte disse zombier.
Processen ID første zombie er 7641, men vi har brug for at finde den proces id af sin overordnede proces. Vi kan gøre det ved hjælp
igen. Vi bruger udskriftsoptionen (
ps
-o
) at fortælle
ps
til kun at vise forældrenes proces-id, og derefter sende det med den
ppid =
flag.
Den proces, vi ønsker at finde, vil blive indikeret ved hjælp af
-p
(Proces), og tryk derefter passerer i zombie proces-id.
Derfor skal du skrive vi følgende kommando for at se op informationsprocessen til proces 7641, men det vil kun rapportere ID overordnede proces:
ps -o ppid = -p 7641
Vi får at vide den overordnede proces-id er 7636. Vi kan nu krydshenvisning dette ved hjælp af
ps.
en gang til.
Vi ser dette kampe navnet på moderprocessen fra tidligere. For at dræbe moderprocessen skal du bruge Sigkill-indstillingen med Kill-kommandoen som følger:
Kill -sigkill 7636
Afhængigt af ejer af moderprocessen skal du måske også bruge
sudo.
.
Zombier er ikke skræmmende ...
... medmindre de er i en massiv horde. Et par er ikke noget at bekymre sig om, og en simpel genstart vil tørre dem ud.
Men hvis du bemærker, at en ansøgning eller proces altid gyder zombier, er det noget, du skal se på. Det er højst sandsynligt bare et sløvt skrevet program, i hvilket tilfælde måske er der en opdateret version, der korrekt renser op efter sine barnprocesser.