Qu'est-ce qu'un processus zombie sous Linux?
Si vous êtes un utilisateur Linux, vous avez peut-être vu des processus zombies bouleverser votre liste de processus. Vous ne pouvez pas tuer un processus zombie car il est déjà mort - comme un zombie réel.
Les zombies sont essentiellement les restes de processus morts qui n'ont pas été nettoyés correctement. Un programme qui crée des processus zombies n'est pas programmé correctement - les programmes ne sont pas supposés laisser les processus zombies rester en place.
Crédit d'image: Daniel Hollister sur Flickr (Remixé)
Qu'est-ce qu'un processus zombie??
Pour comprendre ce qu'est un processus zombie et ce qui provoque son apparition, vous devez comprendre un peu le fonctionnement des processus sous Linux..
Lorsqu'un processus meurt sous Linux, il n'est pas entièrement supprimé de la mémoire: son descripteur de processus reste en mémoire (le descripteur de processus ne prend qu'une petite quantité de mémoire). Le statut du processus devient EXIT_ZOMBIE et le parent du processus est informé que son processus enfant est mort avec le signal SIGCHLD. Le processus parent est alors censé exécuter l'appel système wait () pour lire le statut de sortie du processus mort et d'autres informations. Cela permet au processus parent d’obtenir des informations à partir du processus mort. Après avoir appelé wait (), le processus zombie est complètement supprimé de la mémoire.
Cela se produit normalement très rapidement, vous ne verrez donc pas d'accumulation de processus zombies sur votre système. Cependant, si un processus parent n'est pas programmé correctement et n'appelle jamais wait (), ses enfants zombies resteront en mémoire jusqu'à ce qu'ils soient nettoyés..
Des utilitaires comme GNOME System Monitor, le Haut commande, et le ps commande afficher les processus zombies.
Dangers des processus zombies
Les processus zombies n'utilisent aucune ressource système. (En réalité, chacun utilise une très petite quantité de mémoire système pour stocker son descripteur de processus.) Cependant, chaque processus zombie conserve son identifiant de processus (PID). Les systèmes Linux ont un nombre fini d'ID de processus, 32 767 par défaut sur les systèmes 32 bits. Si les zombies s'accumulent très rapidement (par exemple, si un logiciel serveur mal programmé crée des processus zombies sous charge), l'ensemble du pool de PID disponibles sera finalement affecté à des processus zombie, empêchant ainsi le lancement d'autres processus..
Cependant, quelques processus zombies qui traînent ne posent aucun problème - bien qu'ils indiquent un bogue avec leur processus parent sur votre système..
Se débarrasser des processus zombies
Vous ne pouvez pas tuer les processus zombies comme vous pouvez tuer les processus normaux avec le signal SIGKILL - les processus zombies sont déjà morts. Gardez à l'esprit que vous n'avez pas besoin de vous débarrasser des processus zombies à moins que votre système ne contienne une quantité importante - quelques zombies sont inoffensifs. Cependant, il existe plusieurs façons de se débarrasser des processus zombies..
Une solution consiste à envoyer le signal SIGCHLD au processus parent. Ce signal indique au processus parent d'exécuter l'appel système wait () et de nettoyer ses enfants zombies. Envoyer le signal avec le tuer commande, remplacement pid dans la commande ci-dessous avec le PID du processus parent:
kill -s SIGCHLD pid
Cependant, si le processus parent n'est pas programmé correctement et ignore les signaux SIGCHLD, cela ne changera rien. Vous devrez tuer ou fermer le processus parent des zombies. Lorsque le processus qui a créé les zombies se termine, init hérite des processus zombie et devient leur nouveau parent. (init est le premier processus démarré sous Linux au démarrage et se voit attribuer le PID 1.) init exécute périodiquement l'appel système wait () pour nettoyer ses enfants zombies. Ainsi, init fera un travail rapide sur les zombies. Vous pouvez redémarrer le processus parent après l'avoir fermé..
Si un processus parent continue de créer des zombies, il doit être corrigé de manière à appeler correctement wait () pour récupérer ses enfants zombies. Créez un rapport de bogue si un programme de votre système continue de créer des zombies.