GNU/Linux >> Tutoriels Linux >  >> Linux

Comment systemd gère-t-il la mort d'un enfant d'un processus géré ?

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.


Linux
  1. Comment fonctionne le Sticky Bit ?

  2. Linux - Comment le tueur d'Oom décide-t-il quel processus tuer en premier ?

  3. Comment fonctionne le processus de mise à niveau d'Ubuntu ?

  4. Comment définir le répertoire de travail du processus parent ?

  5. Comment fonctionne copy_from_user du noyau Linux en interne ?

Comment changer la priorité d'un processus sous Linux

Comment envoyer des processus en arrière-plan sous Linux

Comment obtenir un processus enfant à partir d'un processus parent

Comment un noyau monte-t-il la partition racine ?

Comment fonctionne la commande ps ?

Comment fonctionne l'interface de bouclage