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"?
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"?
Respuestas:
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á unaSIGCHLD
señ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, init
sí.
La razón para poner en práctica este mecanismo es que los administradores de servicios de espacio de usuario / supervisores (como upstart
, systemd
necesidad) 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 SIGCHLD
señ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 SIGCHLD
señ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
.