Programmer som er dårlig skrevet eller utfører dårlig kan forlate zombie prosesser lurking inni Linux-maskin. Finn ut hvordan zombier skapes, og hvordan kan du endelig legge dem til hvile.
Hvordan Behandle States Arbeidet med Linux
Linux, selvfølgelig, har å holde styr på alle programmene og demoner som kjører på datamaskinen. En av måtene det gjør dette ved å opprettholde prosessen bordet. Dette er en liste over strukturer i kjerneminne. Hver prosess har en oppføring i denne listen som inneholder litt informasjon om det.
Det er ikke mye i hver av prosessen tabellstrukturer. De holder prosess ID , Et par andre dataelementer, og en peker til prosesskontrollblokk (PCB) i denne prosessen.
Det er den PCB som holder mange detaljer Linux trenger å se opp eller satt for hver prosess. PCB er også oppdatert som et prosess er opprettet, gitt behandlingstid, og til slutt ødelegges.
Linux PCB inneholder over 95 felt.
Det er definert
som en struktur som kalles
task_struct.h
, Og det er over 700 linjer lang. PCB inneholder følgende typer informasjon:
- Process State : De tilstander er beskrevet nedenfor.
- Prosessnummer : Den unike identifikatoren i operativsystemet.
- Programteller : Når denne prosessen er neste gis tilgang til CPU, vil systemet bruke denne adressen for å finne neste instruksjon av prosessen som skal utføres.
- registre : Listen over CPU-registre som brukes av denne prosessen. Listen kan inneholde akkumulatorer, indeksregistre, og stable pekere.
- Åpne File List : Filer assosiert med denne prosessen.
- CPU Planlegging Informasjon : Brukes til å bestemme hvor ofte og hvor lenge, er CPU behandlingstid tildelt denne prosessen. Prioriteten av prosessen, pekere til planlegging køer og andre planlegging parametere må tas opp i kretskortet.
- Memory Management Information : Detaljer om minnet denne prosessen bruker, slik som start- og sluttadressene til prosessen minne og pekere til minnesider.
- I / O statusinformasjon : Enhver inn- eller ut-enheter som brukes ved fremgangsmåten.
Den “Process stat” kan være noe av det følgende:
- R: En kjører eller kjørbart prosess. Kjører betyr det å motta CPU-sykluser og gjennomføring. En kjørbar prosessen er klar til å kjøre og venter på en CPU sporet.
- S: En sovende prosessen. Fremgangsmåten venter på en handling for å fullstendig, slik som en inn- eller utgangsoperasjon, eller for en ressurs for å bli tilgjengelig.
- D: Prosessen er i en avbruddsfri hviletilstand. Den bruker en blokkerende systemkall, og kan ikke fortsette før systemkall er ferdig. I motsetning til “Sleep” tilstand, en prosess i denne tilstanden vil ikke reagere på signaler til systemet samtalen er avsluttet og utførelse har returnert til prosessen.
-
T:
Prosessen er avsluttet (stoppet) fordi den har mottatt
SIGSTOPsignal. Den vil bare svare tilSigkill.ellerSIGCONTsignaler, som enten dreper prosessen eller instruerer den til å fortsette, henholdsvis. Dette er hva som skjer når du bytter fra forgrunnen (fg) til bakgrunn (bg)oppgaver. -
Z:
En Zombie prosess. Når en prosess er fullført, er det ikke bare forsvinne. Det frigjør noe minne den bruker og fjerner seg fra minnet, men den trer i prosessen bordet og PCB forbli. Sin tilstand er satt til
EXIT_ZOMBIE, Og dens overordnede prosessen blir varslet (avSigchld.signal) som barnet prosessen er ferdig.
I Zombie tilstand, kaller den overordnede prosessen en av
vente()
familier av funksjoner
når barnprosessen er opprettet. Det venter da på en statsendring i barnprosessen. Har barnprosessen blitt stoppet, fortsatte, eller drept av et signal? Har det avsluttet ved å løpe gjennom den naturlige ferdigstillelsen av koden sin?
Hvis statens endring er en som betyr at barnprosessen har sluttet å kjøre, er utgangskoden lest. Deretter ødelegges barnets PCB, og dens oppføring i prosessbordet er fjernet. Ideelt sett skjer dette alt i blikket i et øye, og prosessene i zombie-staten eksisterer ikke veldig lenge.
I SLEKT: Slik kjører og kontrollerer Bakgrunnsprosesser på Linux
Hva forårsaker zombieprosesser på Linux?
En dårlig skriftlig overordnet prosess kan ikke ringe
vente()
funksjon når barnprosessen er opprettet. Dette betyr at ingenting ser på statlige endringer i barnprosessen, og
Sigchld.
signalet vil bli ignorert. Eller kanskje et annet program påvirker utførelsen av foreldreprosessen, enten på grunn av dårlig programmering eller ondsinnet hensikt.
Men hvis foreldreprosessen ikke ser på statlige endringer i barnprosessen, vil det ikke forekomme riktig system housekeeping. PCB og oppføring i prosessbordet blir ikke fjernet når barnas prosessen avsluttes. Dette resulterer i at zombie-staten aldri blir fjernet fra PCB.
Zombier bruker litt minne, men de vanligvis ikke utgjør et problem. Oppføringen i prosessbordet er lite, men til det er utgitt, kan prosess-IDen ikke gjenbrukes. På et 64-biters operativsystem, er det lite sannsynlig at det oppstår problemer fordi PCB er mye større enn prosessbordet.
Et stort antall zombier kunne, tenkelig, påvirke mengden minne som er gratis for andre prosesser. Hvis du har det mange zombier, har du imidlertid et alvorlig problem med foreldreapplikasjonen eller en operativsystembugg.
Slik fjerner du zombieprosesser
Du kan ikke drepe en zombieprosess fordi den allerede er død. Det vil ikke svare på noen signaler fordi det er blitt fjernet fra minnet - det er ingen steder å sende en
Sigkill.
signal. Du kan prøve å sende
Sigchld.
Signal til foreldreprosessen, men hvis det ikke fungerte da barnas prosessen avsluttet, er det ikke sannsynlig å jobbe nå, heller.
Den eneste pålitelige løsningen er å drepe foreldreprosessen. Når det er avsluttet, er barnprosessene arvet av
i det
prosess, som er den første prosessen som skal kjøres i et Linux-system (dens prosess-ID er 1).
De
i det
Prosessen utfører regelmessig den nødvendige oppryddingen av zombier, for å drepe dem, du må bare drepe prosessen som skapte dem. De
topp
Kommandoen er en praktisk måte å se om du har noen zombier.
Skriv inn følgende:
Topp
Dette systemet har åtte zombieprosesser. Vi
kan liste disse
Ved å bruke den
PS.
kommando
og piping det inn i
Egrep
. Igjen, zombie prosesser har et statlig flagg av "z", og du vil vanligvis også se "defunct."
Skriv inn følgende:
PS AUX | Egrep "Z | Defunct"
Zombieprosessene er oppført.
Dette er en finere måte å oppdage prosess-IDene til zombier enn å bla frem og tilbake gjennom
topp
. Vi ser også at et program som heter "Badprg" skapte disse zombiene.
Prosess-IDen til den første zombie er 7641, men vi må finne prosess-IDen til sin overordnede prosess. Vi kan gjøre det ved å bruke
en gang til. Vi bruker Output-alternativet (
PS.
-o
) å fortelle
PS.
For å vise kun foreldres prosess-ID, og deretter passere den med
ppid =.
flagg.
Prosessen vi vil finne vil bli indikert ved å bruke
-P.
(prosess) alternativ, og deretter passerer i zombieens prosess-ID.
Derfor skriver vi følgende kommando for å slå opp prosessinformasjonen for prosess 7641, men det vil bare rapportere IDen til foreldreprosessen:
PS -O ppid = -P 7641
Vi blir fortalt at foreldreprosessen ID er 7636. Vi kan nå krysse referanse dette ved å bruke
PS.
en gang til.
Vi ser dette samsvarer med navnet på foreldreprosessen fra tidligere. For å drepe foreldreprosessen, bruk Sigkill-alternativet med Kill-kommandoen som følger:
Drep -Sigkill 7636
Avhengig av eier av foreldreprosessen, må du kanskje også bruke
sudo.
.
Zombier er ikke skummelt ...
... med mindre de er i en massiv horde. Noen er ikke noe å bekymre seg for, og en enkel omstart vil tørke dem ut.
Men hvis du merker at en applikasjon eller prosess alltid er gyte zombier, det er noe du bør se på. Det er mest sannsynlig bare et sloppaktig skriftlig program, i så fall, kanskje det er en oppdatert versjon som renser seg riktig etter barnas prosesser.