Wat is een Zombie-proces op Linux?
Als je een Linux-gebruiker bent, heb je mogelijk zombie-processen gezien die rond je processenlijst lopen. Je kunt een zombieproces niet doden omdat het al dood is - zoals een echte zombie.
Zombies zijn eigenlijk de overblijfselen van dode processen die niet goed zijn opgeruimd. Een programma dat zombie-processen maakt, is niet goed geprogrammeerd - programma's mogen geen zombie-processen 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 in Linux sterft, wordt het niet meteen uit het geheugen verwijderd - de procesdescriptor blijft in het geheugen (de procesdescriptor neemt maar een klein beetje geheugen in beslag). De status van het proces wordt EXIT_ZOMBIE en het bovenliggende bestand van het proces wordt gemeld 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 ophalen. Nadat wait () is aangeroepen, wordt het zombieproces volledig uit het geheugen verwijderd.
Dit gebeurt normaal gesproken heel snel, dus je zult geen zombie-processen zien ophopen op je systeem. Als een bovenliggend proces echter niet juist is geprogrammeerd en nooit wait () aanroept, blijven de zombiekinderen in het geheugen hangen totdat ze zijn opgeruimd.
Hulpprogramma 's zoals GNOME System Monitor, de top opdracht en de ps commando weergave zombie-processen.
Gevaren van Zombie-processen
Zombie-processen gebruiken geen systeembronnen. (Eigenlijk gebruikt iedereen een heel klein beetje systeemgeheugen om zijn 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 zich in een zeer snel tempo ophopen - bijvoorbeeld, als onjuist geprogrammeerde serversoftware zombieprocessen onder belasting creëert - zal de hele verzameling beschikbare PID's uiteindelijk worden toegewezen aan zombieprocessen, waardoor wordt voorkomen dat andere processen worden gestart.
Een paar zombie-processen die rondhangen, vormen echter geen probleem, hoewel ze wel een probleem aangeven met hun bovenliggende proces op uw systeem.
Het wegwerken van zombie-processen
Je kunt zombieprocessen niet doden omdat je normale processen kunt doden met het SIGKILL-signaal - zombieprocessen zijn al dood. Houd in gedachten dat je geen zombie-processen 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 wait () systeemaanroep uit te voeren en zijn zombiekinderen op te ruimen. Verzend het signaal met de doden commando, vervangen pid in de onderstaande opdracht met de PID van het bovenliggende proces:
kill -s SIGCHLD pid
Als het bovenliggende proces echter niet correct is geprogrammeerd en SIGCHLD-signalen negeert, zal dit niet helpen. Je zult het ouderproces van de zombies moeten 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 gestart bij het opstarten van Linux en krijgt de beschikking over PID 1.) init voert de wait () system call 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.