En zombieprosess i Linux refererer til de allerede døde prosessene, men på en eller annen måte er de fremdeles til stede i systemets prosesstabell. Smutthullet er at denne prosessen av en eller annen grunn ikke ble renset av foreldrene fra prosessbordet. Vanligvis skjer dette etter fullført prosess.
Den vanlige måten å bruke Linux på er at etter at en prosess er fullført, varsler den sin overordnede, som er ansvarlig for å fjerne prosessen fra tabellen. Dessverre klarer ikke foreldrene å fjerne prosessen fra minnet i tilfeller der foreldrene ikke kan lese barnets status. Slik kommer det til å være at vi har døde prosesser i prosesstabellen. Dette er det vi kaller zombieprosessene.
Hva forårsaker Linux Zombie prosesser?
Når barneprosessen blir opprettet, kan det hende at en dårlig skrevet foreldreprosess ikke klarer å ringe ventetiden (). Som et resultat vil zombiebarnene dvele i minnet til de slukkes.
Dette betyr at ingenting overvåker spedbarnsprosessen for tilstandsendringer, og SIGCHLD-signalet vil bli ignorert. Kanskje forstyrrer et annet program foreldreprosessens utførelse, enten gjennom elendig programmering eller ondsinnet hensikt.
Riktig rengjøring av systemet vil ikke skje hvis foreldreprosessen ikke ser etter tilstandsendringer i barneprosessen.
Når spedbarnsprosessen er ferdig, blir ikke PCB og oppføringen i prosesstabellen fjernet. Zombiestaten blir aldri fjernet fra PCB som et resultat av dette.
Zombier har noe minne, men det er vanligvis ikke et problem. Fordi Linux-systemer har et endelig antall PID-er (om enn et stort antall), hvis nok PID-er blir zombie, kan ingen andre prosesser starte. Det er tvilsomt at dette vil skje.
Imidlertid antyder zombierte prosesser at noe har gått galt med et program, og at et bestemt program kan ha en feil.
Programvarefeil i datasentre skal ikke tolereres og må adresseres.
Du bør holde øye med og ødelegge zombieprosesser til feilen er løst.
Prosess-ID kan ikke gjenbrukes før den er lansert, så prosessbordets oppføring er liten.
Fordi PCB er mye større enn prosesstabelloppføringen i et 64-biters operativsystem, vil dette neppe forårsake noen problemer.
Mengden minne tilgjengelig for andre prosesser kan bli påvirket av et stort antall zombier. Men hvis du har så mange zombier, har du et alvorlig problem med foreldreapplikasjonen eller en feil i operativsystemet.
Så hva gjør du når en prosedyre blir til en zombie? Du sporer opp og eliminerer zombieprosessene.
Hvordan finne en zombieprosess?
Det første stoppet for å drepe en zombieprosess i systemet er først å identifisere den. Fordi init-prosessen rydder opp etter zombier regelmessig, er alt du trenger å gjøre for å bli kvitt dem å ødelegge prosessen som skapte dem.
Toppkommandoen er en rask måte å se om det er noen zombier i ditt område. For å oppnå dette vil vi utføre følgende kommando.
topp
Antall zombieprosesser i dette systemet vil vises på utdataene. I vårt tilfelle ovenfor har vi 0 zombier.
Ved hjelp av ps-kommandoen og rør den inn i egrep, kan vi få en liste over dem. Statens flagg for zombieprosesser er "Z", og du vil noen ganger også se "nedlagt".
tuts @ fosslinux: ~ $ ps aux | egrep "Z | nedlagt"
La oss bryte ned de forskjellige delene av denne kommandoen.
Z i STAT-kolonnen i utdataene identifiserer en zombieprosess.
[defunct] i den siste (COMMAND) kolonnen i utgangen identifiserer også en zombieprosess.
Ideelt sett er det ikke mulig å drepe en Zombie-prosess fordi den er død. I stedet gir vi foreldrene beskjed om å prøve og lese barnets prosessstatus og til slutt rense dem fra systemets bord. For å utløse denne prosessen sender vi et SIGCHLD-signal til prosessens foreldre. Å identifisere foreldreprosess-ID eller det som kalles PID innebærer å kjøre følgende kommando:
tuts @ fosslinux: ~ $ ps -o ppid =
Etter å ha fått Zombie's PID, bruk kommandoen SIGCHLD signal til de tidligere identifiserte foreldreprosessene.
tuts @ fosslinux: ~ $ kill -s SIGCHLD
I noen tilfeller fjerner dette ikke Zombie-prosessen. Dette kaller oss til å delta i plan b eller c. Det tidligere innebærer å starte foreldreprosessen på nytt eller drepe foreldreprosessene. På den annen side innebærer sistnevnte tilfeller å starte en systemstart på nytt, spesielt når Zombie-prosessen kan forårsake strømbrudd eller en massiv bølge på grunn av Zombie-prosessen.
Nedenfor er kommandoen for å drepe foreldreprosessen.
tuts @ fosslinux: ~ $ kill -9
I tilfelle en foreldreprosess blir drept, blir alle barneprosessene til den gitte forelderen også drept. Hvis en av barneprosessene er kritisk til det gitte tidspunktet, kan det hende du må utsette drapet til det er trygt. På den annen side kan en rask dobbeltsjekk fortelle deg hvor mye minne eller prosessorkraft Zombie-prosessene bruker. Dette er med på å avgjøre om det bedre alternativet er å drepe foreldreprosessoren for å starte systemet på nytt i den følgende syklusen av systemvedlikeholdet som allerede er planlagt.
Hvordan fungerer prosesstilstander på Linux på Linux?
Selvfølgelig må Linux holde oversikt over alle applikasjonene og demonene som kjører på datamaskinen din. Vedlikehold av prosessbordet er en av måtene det oppnår dette.
Dette er en liste over kjerneminnestrukturer. Denne listen inneholder en oppføring for hver prosess som inneholder litt informasjon om den. Hver av prosessbordstrukturene inneholder svært lite informasjon.
De lagrer prosess-ID, noen få andre informasjonsbiter og en peker til prosesskontrollblokken (PCB).
PCB er der Linux lagrer all informasjonen den trenger for å slå opp eller sette for hver prosess. Når en prosess opprettes, blir den modifisert, gitt behandlingstid og deretter ødelagt.
Det er over 95 felt på Linux PCB. Det er definert i oppgavestrukturen, som er over 700 linjer lang. Følgende informasjon finner du på PCB:
Prosesstilstandene er illustrert nedenfor
- Prosessnummer: Operativsystemets særegne identifikator.
- Programteller: Når denne prosessen får tilgang til CPU igjen, vil systemet bruke denne adressen til å finne neste instruksjon av prosessen som skal utføres.
- Registers: Denne prosedyren bruker en liste over CPU-registre som kalles registre. Akkumulatorer, indeksregister og stakkpekere kan være inkludert i listen.
- Åpne filliste: Filer assosiert med denne prosedyren er inkludert i listen over åpne filer.
- Informasjon om CPU-planlegging: Brukes til å beregne hvor ofte og hvor lenge denne prosessen mottar CPU-behandlingstid.
PCB må registrere prosessprioritet, pekere til planleggingskøer og andre planleggingsparametere. - Informasjon om minnestyring: Informasjon om minnet som denne prosessen bruker, for eksempel start- og sluttadressene til prosessminnet, samt pekere til minnesider.
- Informasjon om I / O-status: Enheter som prosessen bruker som innganger eller utganger.
Alt av følgende kan være "prosesstilstand":
- R: En prosess som kjører eller er i stand til å kjøre. Den kjører, noe som betyr at den får og utfører CPU-sykluser.
En prosedyre som er klar til å kjøres, venter på et CPU-spor. - S: Søvnen.
Prosessen venter på at en handling er fullført, for eksempel en inngangs- eller utgangsoperasjon. Eller en ressurs tilgjengelighet. - D: Prosedyren er i en tilstand av ikke-avbrutt søvn. Det bruker et blokkerende systemanrop, noe som betyr at det ikke fortsetter før systemanropene er fullført. I motsetning til "Hvilemodus" vil en prosess i denne tilstanden ikke svare på signaler før systemanropet er fullført og kjøringen har returnert til prosessen.
- T: Fordi det fikk SIGSTOP-signalet, er prosessen avsluttet (stoppet).
Den vil bare svare på SIGKILL- eller SIGCONT-signalene, enten drepe eller instruere prosessen om å fortsette. Når du bytter fra forgrunnen (fg) til bakgrunnsoppgaver (bg), skjer dette. - Z: står for Zombie Process. Når en prosess er ferdig, forsvinner den ikke bare. I stedet frigjør det noe minne det bruker for øyeblikket og avslutter minne, men prosessbordoppføringen og PCB forblir.
Dens tilstand er satt til EXIT ZOMBIE, og den overordnede prosessen blir fortalt at spedbarnsprosessen er fullført via SIGCHLD-signalet.
Konklusjon
Med mindre de er en del av en enorm horde, er ikke Zombies så skadelige. Noen få er ikke så farlig, og en rask omstart vil fjerne dem. Imidlertid er det ett poeng å vurdere.
Linux-arkitekturer har maksimalt antall prosesser og som et resultat maksimalt antall prosess-ID-nummer. Når datamaskinens maksimale antall zombieprosesser oppnås, kan ikke nye prosesser startes.
Zombie-prosesser er ikke prosesser; de er restene av døde prosesser som deres foreldreprosess ikke har ryddet opp riktig. Men hvis du merker at en bestemt applikasjon eller prosess konstant gyter zombier, bør du undersøke nærmere.
Mest sannsynlig er det bare et dårlig skrevet program; i så fall er det kanskje en oppdatert versjon som rydder opp etter at barnet har behandlet riktig.