J'ai un processus de zombie ennuyeux qui est adopté par init, et il ne disparaîtra pas. J'ai lu qu'il existe un moyen de créer un processus factice, d'attacher le zombie en tant qu'enfant de ce nouveau processus, puis de le tuer, en le supprimant de la table des processus.
Comment pourrais-je faire cela, précisément?
Et oui, j'ai lu la plupart de ces trucs:
Un processus zombie est déjà mort, il ne peut donc pas être tué.
Ou
Vous devez simplement redémarrer votre système
Et
Les processus zombies n'utilisent aucune ressource, vous devez simplement les laisser être
Malheureusement, de nombreux programmes vérifient la table de processus pour voir si une instance est déjà en cours d'exécution et refusent d'en démarrer une nouvelle s'il existe une entrée dans la table de processus.
Et redémarrer à chaque fois que ma connexion SSHFS s'arrête, emportant Sublime avec, est un peu idiot.
Réponses:
La seule façon de se débarrasser d'un zombie est de faire son parent
wait()
afin qu'il puisse signaler son statut de sortie. Vous pouvez le faire en envoyantSIGCHLD
au parent, en supposant que le parent est écrit correctement.Si vous avez des zombies, cela signifie généralement que le parent n'est PAS écrit correctement (parce que l'enfant a déjà été envoyé
SIGCHLD
à son parent lorsqu'il est décédé et est devenu un zombie), la prochaine étape consiste donc à tuer le parent.Un outil comme
pstree
(avec l'-p
option) peut vous montrer la lignée de vos zombies afin que vous sachiez quel processus est le parent.Lorsque le parent décède, le zombie sera adopté par
init
, qui est toujours enwait()
train de mourir pour les enfants, et tuera joyeusement tous les zombies qu'il adopte.Si le processus parent est en fait
init
(PID 1), vous êtes déjà dans une situation qui ne devrait jamais se produire. Vous pouvez essayer d'envoyerSIGCHLD
versinit
, mais vous ne devriez vraiment pas avoir à le faire, et si cela ne fonctionne pas, votre seul recours est de redémarrer car votre systèmeinit
est en panne et ne fait pas son travail.(Ce sont les options de "fusil de chasse".)
Des gens plus créatifs que moi ont également proposé cette option si vous voulez éviter de tuer le processus parent:
(pour cet exemple, disons que le zombie est PID 3101 et le parent est PID 3100)
gdb
etattach
au parent:attach 3100
waitpid
le zombie:call waitpid(3101,0,0)
detach
) et quittez le débogueur.(Il s'agit d'un fusil de sniper finement réglé.)
la source
waitpid()
ne m'est jamais venue à l'esprit . Je suis un terrible ancien programmeur ...call waitpid
ne revient jamais pour moiPourquoi vous inquiétez-vous des processus zombies? Les ressources qu'ils gardent liées sont minimes (espace pour une tâche de structure squelette, un PID et pas grand chose d'autre). Bien sûr, c'est inconvenant, mais c'est tout. Recherchez leurs parents et corrigez-les, remplacez-les par de meilleures alternatives écrites (pourraient avoir d'autres effets secondaires bénéfiques), signalez cela comme des bogues (ce qu'ils sont certainement).
la source