Le mot "subreaper" est utilisé dans certaines réponses. La recherche sur Google affiche également des entrées dont le mot est "juste utilisé".
Comment puis-je comprendre ce qu'est un "subreaper"?
Le mot "subreaper" est utilisé dans certaines réponses. La recherche sur Google affiche également des entrées dont le mot est "juste utilisé".
Comment puis-je comprendre ce qu'est un "subreaper"?
Réponses:
Ceci a été implémenté dans le noyau Linux 3.4 en tant qu'indicateur de l'appel système prctl () .
De la prctl(2)
page de manuel:
[...] Une sous-traitante remplit le rôle de
init(1)
pour ses processus descendants. À la fin d'un processus devenu orphelin (c'est-à-dire que son parent immédiat est déjà terminé) et marqué comme ayant un sous-processeur, l'ancêtre le plus proche toujours en vie recevra unSIGCHLD
signal et sera en mesure de connaître lewait(2)
statut de fin du processus.
Un processus peut se définir comme une sous-traitante avec prctl(PR_SET_CHILD_SUBREAPER)
. Si tel est le cas, ce n'est pas init
(PID 1) qui deviendra le parent des processus enfants orphelins , mais le grand-parent vivant le plus proche qui est marqué en tant que subreaper deviendra le nouveau parent. S'il n'y a pas de grand-parent vivant, oui init
.
La raison de mettre en œuvre ce mécanisme était que les gestionnaires / superviseurs de services en espace utilisateur (comme upstart
, systemd
) devaient suivre leurs services démarrés. De nombreux services démantèlent par double-forgeage et deviennent implicitement liés à nouveau au PID 1. Le gestionnaire de services ne sera plus en mesure de recevoir les SIGCHLD
signaux et ne sera plus en charge de récolter les enfants wait()
. Toutes les informations sur les enfants sont perdues au moment où PID 1 nettoie les processus re-parentés. Désormais, un processus de gestionnaire de services peut se désigner comme une sorte de "sous-init" et peut maintenant rester en tant que parent de tous les processus orphelins créés par les services démarrés. Tous les SIGCHLD
signaux seront livrés au gestionnaire de service.
Sous Linux, un démon est généralement créé en copiant deux fois le processus intermédiaire, après avoir quitté le petit-enfant. C'est une technique courante pour éviter les processus zombies . Le script init appelle un enfant. Cet enfant bifurque à nouveau et quitte donc immédiatement. Le petit-fils sera adopté par init
, qui appelle en permanence wait()
à recueillir le statut de sortie de ses enfants pour éviter les zombies. Avec le concept de sous-arpenteurs, le gestionnaire de services en espace utilisateur devient désormais le nouveau parent init
.