¿Qué es un proceso "subreaper"?

39

La palabra "subreaper" se usa en algunas respuestas. Al buscar en Google también aparecen entradas en las que la palabra "se acaba de usar".

¿Cómo puedo entender qué es un "subreaper"?

kenchew
fuente
3
Nunca escuché la palabra antes. ¿Puedes incluir algunas referencias para el contexto?
Celada
55
Aquí hay uno: lo usé en una respuesta en unix.stackexchange.com/a/177361/5132 .
JdeBP
Pregunta relacionada que tal vez debería haber publicado aquí en lugar de en serverfault serverfault.com/questions/747070/…
artfulrobot

Respuestas:

50

Esto se implementó en el kernel 3.4 de Linux como un indicador de la llamada al sistema prctl () .

Desde la página del prctl(2)manual:

[...] Un subreaper cumple la función de init(1)sus procesos descendientes. Tras la finalización de un proceso que queda huérfano (es decir, su padre inmediato ya ha finalizado) y marcado como que tiene un subreáper, el subreaper ancestro aún más cercano recibirá una SIGCHLDseñal y podrá wait(2)en el proceso descubrir su estado de terminación.

Un proceso puede definirse a sí mismo como un subreaper con prctl(PR_SET_CHILD_SUBREAPER). Si es así, no es init(PID 1) el que se convertirá en el padre de los procesos secundarios huérfanos , en cambio, el abuelo vivo más cercano que está marcado como un subárea se convertirá en el nuevo padre. Si no hay abuelos vivos, initsí.

La razón para poner en práctica este mecanismo es que los administradores de servicios de espacio de usuario / supervisores (como upstart, systemdnecesidad) para realizar un seguimiento de sus servicios iniciados. Muchos servicios se demonizan mediante doble bifurcación y se vuelven a emparejar implícitamente con PID 1. El administrador del servicio ya no podrá recibir las SIGCHLDseñales y ya no se encargará de cosechar a los niños wait(). Toda la información sobre los niños se pierde en el momento en que PID 1 limpia los procesos parentalizados. Ahora, un proceso de administrador de servicios puede marcarse a sí mismo como una especie de "subiniciado" y ahora puede permanecer como padre para todos los procesos huérfanos creados por los servicios iniciados. Todas las SIGCHLDseñales serán entregadas al gerente de servicio.

En Linux, un demonio generalmente se crea bifurcando dos veces con el proceso intermedio que sale después de bifurcar al nieto. Esta es una técnica común para evitar procesos zombies . El guión de inicio llama a un niño. Ese niño se bifurca nuevamente y, por lo tanto, sale inmediatamente. El nieto será adoptado por init, que llama continuamente wait()para recopilar el estado de salida de sus hijos para evitar zombis. Con el concepto de subreápers, el administrador del servicio del espacio de usuario ahora se convierte en el nuevo padre, en lugar de hacerlo init.

caos
fuente
Entonces, ¿puedo pensar que el proceso "cosecha" el "sub" proceso? ¿O el proceso es un segador "sub" porque el segador "principal" es init? Solo trato de pensar cómo se acuñó el término. ¡Gracias por la respuesta!
kenchew
3
Siguiendo el enlace de Linux kernel 3.4 anterior, el comentario de confirmación para esta implementación tiene más detalles. (Impresionado por los detalles ocultos en un comentario de git)
kenchew