GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo maneja systemd la muerte de un hijo de un proceso administrado?

No.

El proceso principal maneja la muerte de sus hijos, en forma normal.

Este es el mundo POSIX. Si el proceso A ha bifurcado B y el proceso B ha bifurcado C, D y E; entonces el proceso B es lo que ve el SIGCHLD y wait() estado de la terminación de C, D y E. El proceso A no sabe lo que sucede con C, D y E, y esto es independiente de systemd.

Para que A sepa que C, D y E terminan, tienen que suceder dos cosas.

  • A tiene que registrarse como "subrecolector". systemd hace esto, al igual que otros administradores de servicios, incluidos upstart y nosh service-manager .
  • B tiene que exit() . Los servicios que tonta, errónea y vanamente intentan "demonizarse" a sí mismos hacen esto.

(Uno puede ser inteligente con kevent() en los BSD. Pero esta es una pregunta de Linux).


systemd tiene el concepto de un proceso principal. En la documentación de systemd, esto se denomina "proceso de servicio principal" o simplemente "proceso principal".

El ejemplo 4 en la documentación de systemd.service describe que el proceso principal se calcula cuando Type=forking .

La documentación para Restart= en los documentos de systemd.service se describen las diferentes posibilidades cuando se inicia un servicio en relación con el proceso principal.

Aquí está el texto clave del "ejemplo 4" vinculado arriba:

systemd considerará que el servicio está en proceso de inicialización mientras el programa original aún se está ejecutando. Una vez que sale con éxito y queda al menos un proceso (andRemainAfterExit=no), el servicio se considera iniciado.

A menudo, un demonio tradicional solo consta de un proceso. Por lo tanto, si solo queda un proceso después de que finaliza el proceso original, systemd considerará ese proceso como el proceso principal del servicio. En ese caso, la variable $MAINPID estará disponible en ExecReload=,ExecStop=, etc.

En caso de que quede más de un proceso, systemd no podrá determinar el proceso principal, por lo que no asumirá que existe uno. En ese caso, $MAINPID no se expandirá a nada. Sin embargo, si el proceso decide escribir un archivo PID tradicional, systemd podrá leer el PID principal desde allí. Establezca PIDFile=en consecuencia.


Linux
  1. ¿Cómo encontrar todos los procesos secundarios?

  2. Cómo obtener un proceso secundario del proceso principal

  3. ¿Cómo monta un kernel la partición raíz?

  4. ¿Cómo maneja copy-on-write en fork() múltiples bifurcaciones?

  5. ¿Cómo funciona la interfaz de bucle invertido?

Cómo cambiar la prioridad de un proceso en Linux

¿Cómo funciona la punta adhesiva?

Linux:¿cómo decide The Oom Killer qué proceso eliminar primero?

Linux:¿cómo pasa Node.js/el módulo de clúster nuevas conexiones desde el proceso principal/principal a los procesos secundarios?

¿Cómo funciona el proceso de actualización de Ubuntu?

Cómo enviar procesos a segundo plano en Linux