Program som är dåligt skrivna eller utförs dåligt kan lämna Zombie processer lurar inuti din Linux-dator. Ta reda på hur zombies skapas och hur du äntligen kan lägga dem för att vila.
Hur processstaterna arbetar med Linux
Linux måste naturligtvis hålla reda på alla program och daemoner som körs på din dator. Ett av de sätt det gör är detta genom att behålla processbordet. Detta är en lista över strukturer i kärnminne. Varje process har en post i den här listan som innehåller lite information om den.
Det finns inte en hel del i var och en av processbordstrukturerna. De håller process id , några andra dataobjekt och en pekare till processkontrollblocket (PCB) för den processen.
Det är den PCB som innehåller de många detaljer Linux behöver leta upp eller ställa in för varje process. PCB är också uppdaterad eftersom en process skapas, med tanke på bearbetningstid och slutligen förstörs.
Linux-PCB innehåller över 95 fält.
Det är definierat
som en struktur som heter
uppgift_struct.h
, och det är över 700 linjer långa. PCB innehåller följande typer av information:
- Processstatus : Staterna beskrivs nedan.
- Processnummer : Dess unika identifierare inom operativsystemet.
- Programräknare : När denna process är nästa tillträde till CPU, kommer systemet att använda den här adressen för att hitta nästa instruktion av den process som ska utföras.
- Register : Förteckningen över CPU-register som används av denna process. Listan kan innehålla ackumulatorer, indexregister och stapelpekare.
- Öppna fillista : Filer som är associerade med den här processen.
- CPU-schemaläggningsinformation : Används för att bestämma hur ofta, och hur länge CPU-behandlingstiden tilldelas denna process. Processens prioritet, pekare för att schemalägga köer och andra schemaläggningsparametrar måste spelas in i PCB.
- Minneshanteringsinformation : Detaljer om minnet Den här processen använder, till exempel start- och slutadresserna till processminnet och pekar på minnesidorna.
- I / O statusinformation : Alla in- eller utgångsenheter som används av processen.
"Process State" kan vara något av följande:
- R: En löpande eller körbar process. Running betyder att det mottar CPU-cykler och exekvering. En körbar process är klar att springa och vänta på en CPU-kortplats.
- S: En sovande process. Processen väntar på att en åtgärd ska slutföras, till exempel en in- eller utgångsoperation eller för att en resurs ska bli tillgänglig.
- D: Processen är i en oavbruten sömnstatus. Det använder ett blockeringssystemsamtal och kan inte fortsätta tills systemsamtalen har slutfört. Till skillnad från "sömn" -tillståndet kommer en process i detta tillstånd inte att svara på signaler tills systemsamtalet är klart och utförandet har återvänt till processen.
-
T:
Processen har avslutats (stoppad) eftersom den mottog
Sigstopsignal. den kommer bara att svara tillSigkillellerSiligsignaler, som antingen döda processen eller instruera den att fortsätta respektive. Det här är vad som händer när du byter från förgrunden (fg) till bakgrund (bg)uppgifter. -
Z:
En zombieprocess. När en process är klar försvinner den inte bara. Det frigör ett minne det använder och tar bort sig från minnet, men dess inmatning i processtabellen och PCB kvarstår. Dess tillstånd är inställd på
Exit_Zombie, och dess föräldraprocess anmäls (avSigchldsignal) som barnprocessen är klar.
I zombie-staten kallar moderprocessen en av de
vänta()
Familjer av funktioner
när barnprocessen skapas. Det väntar sedan på en statlig förändring i barnprocessen. Har barnprocessen blivit stoppad, fortsatte eller dödats av en signal? Har den avslutats genom att springa genom den naturliga slutförandet av sin kod?
Om den statliga förändringen är en som betyder att barnprocessen har slutat springa, läses utgångskoden. Då förstörs barnets PCB och dess inmatning i processbordet tas bort. Helst händer allting i ögonblicket, och processer i zombiesstaten existerar inte länge.
RELATERAD: Hur man kör och kontrollerar bakgrundsprocesser på Linux
Vad orsakar zombieprocesser på Linux?
En dåligt skriftlig föräldraprocess kanske inte kallar
vänta()
Funktion när barnprocessen är skapad. Det betyder att ingenting tittar på statliga förändringar i barnprocessen, och
Sigchld
signalen kommer att ignoreras. Eller kanske en annan applikation påverkar genomförandet av moderprocessen, antingen på grund av dålig programmering eller skadlig avsikt.
Men om föräldraprocessen inte tittar på statliga förändringar i barnprocessen, kommer det korrekta systemhushållningen inte att uppstå. PCB och posten i processtabellen kommer inte att tas bort när barnprocessen slutar. Detta resulterar i att zombie-staten aldrig avlägsnas från PCB.
Zombies använder lite minne, men de brukar inte utgöra ett problem. Inträdet i processbordet är liten, men tills det släpptes kan process-ID inte återanvändas. På ett 64-bitars operativsystem är det osannolikt att orsaka problem eftersom PCB är mycket större än processbordet.
Ett stort antal zombier kunde, tänkbart, påverka mängden minne som är gratis för andra processer. Om du har det många zombies, men har du ett allvarligt problem med föräldraansökan eller ett operativsystemfel.
Så här tar du bort zombieprocesser
Du kan inte döda en zombieprocess eftersom den redan är död. Det kommer inte att svara på några signaler eftersom det har tagits bort från minnet - det finns ingenstans att skicka en
Sigkill
signal. Du kan försöka skicka
Sigchld
Signal till moderprocessen, men om det inte fungerade när barnprocessen avslutades, är det osannolikt att fungera nu heller.
Den enda tillförlitliga lösningen är att döda föräldraprocessen. När den avslutas är dess barnprocesser ärvda av
i det
Process, som är den första processen som ska köras i ett Linux-system (dess process-ID är 1).
De
i det
Processen utför regelbundet den nödvändiga rengöringen av zombies, så att de döda dem, måste du bara döda processen som skapade dem. De
topp
Kommando är ett bekvämt sätt att se om du har några zombies.
Skriv följande:
Topp
Detta system har åtta zombieprocesser. Vi
kan lista dessa
Genom att använda
f
kommando
och rör det in i
eGrep
. Återigen har zombieprocesser en statlig flagga av "Z," och du brukar också se "defunct."
Skriv följande:
PS AUX | Egrep "Z | Defunct"
Zombie-processerna är listade.
Detta är en Neater sätt att upptäcka process-ID-skivorna för zombies än att rulla fram och tillbaka genom
topp
. Vi ser också att en ansökan som heter "BADPRG" skapade dessa zombies.
Process-ID för den första zombie är 7641, men vi måste hitta process-ID för sin föräldraprocess. Vi kan göra det med hjälp av
på nytt. Vi använder optionalternativet (
f
-o
) att berätta
f
att bara visa föräldrars process-ID och skicka det med
ppid =
flagga.
Processen vi vill hitta kommer att indikeras med hjälp av
-p
(Process) Alternativ, och sedan passera i zombies process-ID.
Därför skriver vi följande kommando för att leta upp processinformationen för Process 7641, men det kommer bara att rapportera ID för moderprocessen:
PS -O PPID = -P 7641
Vi får veta föräldraprocessen ID är 7636. Vi kan nu korsa det här med hjälp av
f
en gång till.
Vi ser att detta matchar namnet på föräldraprocessen från tidigare. För att döda föräldraprocessen, använd SIGKILL-alternativet med Kill-kommandot enligt följande:
Kill -Sigkill 7636
Beroende på ägaren av moderprocessen kan du också behöva använda
sudo
.
Zombies är inte läskiga ...
... om de inte är i en massiv horde. Några är inte något att oroa sig för och en enkel omstart kommer att torka ut dem.
Men om du märker att en applikation eller process alltid gynar zombies, det är något du ska titta på. Det är troligtvis bara ett snyggt skrivet program, i vilket fall, kanske det är en uppdaterad version som rengörs ordentligt efter barnprocesserna.