Qu'est-ce qu'un processus «sous-traitant»?

39

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"?

kenchew
la source
3
Je n'ai jamais entendu le mot avant. Pouvez-vous inclure des références pour le contexte?
Celada
5
En voici un: je l'ai utilisé dans une réponse à l' adresse unix.stackexchange.com/a/177361/5132 .
JdeBP
Question connexe que j'aurais peut-être dû poster ici plutôt que sur serverfault serverfault.com/questions/747070/…
artfulrobot

Réponses:

50

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 un SIGCHLDsignal et sera en mesure de connaître le wait(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 SIGCHLDsignaux 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 SIGCHLDsignaux 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.

le chaos
la source
Alors, puis-je penser que le processus "récolte" le "sous-processus"? Ou, le processus est un "sous" reaper parce que le "principal" reaper est init? J'essaie juste de penser comment le terme a été inventé. Merci d'avoir répondu!
kenchew
3
En suivant le lien du noyau Linux 3.4 ci-dessus, le commentaire de validation pour cette implémentation contient plus de détails. (Impressionné par les détails cachés dans un commentaire git)
kenchew