Ce n'est pas le cas.
Le processus principal gère la mort de ses enfants, de la manière habituelle.
C'est le monde POSIX. Si le processus A a bifurqué B et que le processus B a bifurqué C, D et E ; alors le processus B est ce qui voit le SIGCHLD
et wait()
statut à partir de la fin de C, D et E. Le processus A ne sait pas ce qui arrive à C, D et E, et ceci indépendamment de systemd.
Pour que A soit conscient que C, D et E se terminent, deux choses doivent se produire.
- A doit s'enregistrer en tant que "sous-moissonneur". systemd le fait, tout comme divers autres gestionnaires de services, y compris upstart et nosh
service-manager
. - B doit
exit()
. Les services qui essaient bêtement, à tort et en vain de se "démoniser" le font.
(On peut devenir intelligent avec kevent()
sur les BSD. Mais c'est une question Linux.)
systemd
a le concept d'un processus principal. Dans la documentation de systemd, cela est appelé le "processus de service principal" ou simplement le "processus principal".
L'exemple 4 dans la documentation systemd.service décrit que le processus principal est calculé lorsque Type=forking
.
La documentation pour Restart=
dans la documentation systemd.service décrivent les différentes possibilités de démarrage d'un service par rapport au processus principal.
Voici le texte clé de "l'exemple 4" lié ci-dessus :
systemd considérera que le service est en cours d'initialisation alors que le programme d'origine est toujours en cours d'exécution. Une fois qu'il se termine avec succès et qu'il reste au moins un processus (andRemainAfterExit=no), le service est considéré comme démarré.
Souvent, un démon traditionnel ne consiste qu'en un seul processus. Par conséquent, s'il ne reste qu'un seul processus après la fin du processus d'origine, systemd considérera ce processus comme le processus principal du service. Dans ce cas, la variable $MAINPID sera disponible dans ExecReload=,ExecStop=, etc.
S'il reste plus d'un processus, systemd ne sera pas en mesure de déterminer le processus principal, il ne supposera donc pas qu'il en existe un. Dans ce cas, $MAINPID ne s'étendra à rien. Cependant, si le processus décide d'écrire un fichier PID traditionnel, systemd pourra lire le PID principal à partir de là. Veuillez définir PIDFile=en conséquence.