20Aug

Wat is een "Zombie-proces" onder Linux?

Als u een Linux-gebruiker bent, heeft u mogelijk zombie-processen rond uw lijst met processen zien rondscharrelen. Je kunt een zombieproces niet doden omdat het al dood is - zoals een echte zombie.

Zombies zijn in feite de overblijfselen van dode processen die niet goed zijn opgeschoond. Een programma dat zombie-processen maakt, is niet goed geprogrammeerd - programma's mogen de zombie-processen niet laten rondhangen.

Image Credit: Daniel Hollister op Flickr( Remixed)

Wat is een zombie-proces?

Om te begrijpen wat een zombieproces is en wat ervoor zorgt dat zombieprocessen verschijnen, moet je een beetje weten hoe processen werken op Linux.

Wanneer een proces sterft onder Linux, wordt het niet meteen uit het geheugen verwijderd - de procesdescriptor blijft in het geheugen( de procesdescriptor neemt slechts een kleine hoeveelheid geheugen in beslag).De status van het proces wordt EXIT_ZOMBIE en de bovenliggende van het proces krijgt een melding dat het onderliggende proces is overleden met het SIGCHLD-signaal. Het parent-proces moet dan de systeemaanroep wait() uitvoeren om de exit-status van het dode proces en andere informatie te lezen. Hierdoor kan het bovenliggende proces informatie uit het dode proces halen. Nadat wait() is aangeroepen, wordt het zombieproces volledig uit het geheugen verwijderd.

Dit gebeurt normaal gesproken erg snel, dus je zult geen zombie-processen zien accumuleren op je systeem. Als een ouderproces echter niet correct is geprogrammeerd en nooit Wait() aanroept, blijven de zombiekinderen in het geheugen hangen totdat ze worden opgeruimd.

Hulpprogramma's zoals GNOME System Monitor, de -top -opdracht en de ps -opdracht geven zombie-processen weer.

Gevaren van Zombie-processen

Zombie-processen gebruiken geen systeembronnen.(Eigenlijk gebruikt iedereen een heel klein beetje systeemgeheugen om de procesdescriptor op te slaan.) Elk zombieproces behoudt echter zijn proces-ID( PID).Linux-systemen hebben een eindig aantal proces-ID's - standaard 32767 op 32-bits systemen. Als zombies in een zeer snel tempo accumuleren, bijvoorbeeld als onjuist geprogrammeerde serversoftware zombieprocessen onder belasting aan het creëren is, zal de gehele pool van beschikbare PID's uiteindelijk worden toegewezen aan zombieprocessen, waardoor wordt voorkomen dat andere processen worden gestart.

Echter, een paar zombie-processen die rondhangen zijn geen probleem - hoewel ze wel een bug aangeven met hun bovenliggende proces op jouw systeem.

Zombie-processen verwijderen

Je kunt zombie-processen niet doden omdat je normale processen kunt doden met het SIGKILL-signaal - zombie-processen zijn al dood. Houd in gedachten dat je zombie-processen niet hoeft te verwijderen, tenzij je een groot deel van je systeem hebt - een paar zombies zijn ongevaarlijk. Er zijn echter een paar manieren om zombie-processen kwijt te raken.

Eén manier is door het SIGCHLD-signaal naar het bovenliggende proces te sturen. Dit signaal vertelt het bovenliggende proces om de systeemaanroep wait() uit te voeren en zijn zombiekinderen op te ruimen. Stuur het signaal met de opdracht kill en vervang pid in de onderstaande opdracht met de PID:

kill -s SIGCHLD pid

, maar als het bovenliggende proces niet correct is geprogrammeerd en SIGCHLD-signalen negeert, wint ditniet helpen. Je moet het ouderproces van de zombies doden of sluiten. Wanneer het proces dat de zombies heeft gemaakt eindigt, neemt het de zombieprocessen over en wordt het hun nieuwe ouder.(init is het eerste proces dat gestart is bij Linux bij het opstarten en is toegewezen aan PID 1.) init voert periodiek de wait() systeemaanroep uit om zijn zombiekinderen op te ruimen, dus init zal korte metten maken met de zombies. U kunt het bovenliggende proces opnieuw starten nadat u het sluit.

Als een ouderproces zombies blijft maken, moet het worden opgelost zodat het wait() op de juiste manier aanroept om zijn zombiekinderen te oogsten. Dien een foutenrapport in als een programma op uw systeem zombies blijft maken.