57 votes

systemd forking vs simple ?

Je suis en train d'écrire mon premier systemd dossier de l'unité.

Para Type il y a plusieurs choix possibles : forking , simple etc. J'ai lu le Documentation Redhat sur ce sujet (tableau 9.9), mais je ne sais toujours pas quand je dois utiliser telle ou telle option.

Des directives ?

103voto

Sven Points 10540

Lorsque vous démarrez le service manuellement à partir de la ligne de commande (sans utiliser la commande nohup ou la commande de préfixe & pour l'exécuter en arrière-plan, ou en d'autres termes, il suffit d'exécuter la commande que vous mettriez dans le fichier ExecStart= ligne de la .service ), que se passe-t-il ?

a) Si le service démarre et continue à fonctionner, et que l'invite ne revient pas jusqu'à ce que vous appuyiez sur Control-C ou que vous arrêtiez le service d'une autre manière : alors Type = simple (o Type = exec si votre version de systemd l'a) est le bon choix.

La différence pratique entre Type = simple y Type = exec est surtout dans la détection des erreurs : Type = simple procédera à d'autres tâches dès que systemd aura fork() a créé un nouveau processus pour lui, et il peut donc permettre à des choses dépendantes de se dérouler même si l'invocation du processus réel de la Exec= échoue. D'autre part, Type = exec vérifiera le Exec= est effectivement invoquée avec succès et signale un échec dans le cas contraire.

Donc, si votre systemd est suffisamment récent pour supporter le Type = exec vous préférerez peut-être l'utiliser plutôt que Type = simple pour une meilleure vérification des erreurs. Mais si vous avez besoin que le démarrage se fasse le plus rapidement possible, et que la détection rapide de l'échec du démarrage de votre service n'est pas essentielle, et/ou si vous souhaitez être compatible avec les anciennes versions de systemd vous pouvez toujours utiliser Type = simple .

b) Si l'invite revient mais que le service continue de fonctionner en arrière-plan (c'est-à-dire que le service se démonétise tout seul), alors Type = forking est le bon choix.

c) Si le service fait son travail et retourne à l'invite sans rien laisser s'exécuter (c'est-à-dire que le service se contente d'ajuster certains paramètres du noyau, d'envoyer une commande à quelque chose d'autre ou de faire quelque chose de similaire), alors Type = oneshot est probablement le bon choix. Dans ce cas, ExecStart du service pourrait être l'ordre de "régler" quelque chose, et ExecStop serait la commande correspondante pour le "déverrouiller". Ce type bénéficie généralement de RemainAfterExit=true Ainsi, systemd conservera l'"état" de ce service en fonction du dernier "set" ou "unset".

L'autre Type sont des cas particuliers. Par exemple, si le service utilise une connexion D-Bus, alors Type = dbus pourrait être le meilleur choix. Il fait systemd conscient de ce fait, et ensuite systemd suivra ce service (et tout ce qui en dépend) par la présence de ce service sur le D-Bus.

Pour utiliser Type = notify le processus doit pouvoir se connecter au socket Unix spécifié dans la variable d'environnement $NOTIFY_SOCKET et de signaler son état en écrivant des messages à cette socket chaque fois que nécessaire. De plus, le fichier de service doit spécifier l'option NotifyAccess pour accorder l'accès à la prise de notification comme il convient.

Il existe un utilitaire de ligne de commande systemd-notify et une fonction de la bibliothèque C sd_notify(3) que vous pouvez utiliser pour envoyer ces messages, mais si aucun d'entre eux ne convient à vos besoins, vous pouvez simplement implémenter votre propre expéditeur de messages. Les messages requis sont très simples, et ressemblent à des affectations de variables Shell : par exemple, pour notifier que le service a terminé avec succès le démarrage et est prêt à servir toutes les demandes entrantes, le service doit envoyer la chaîne équivalente à la sortie de printf "READY=1\n" à la prise. Voir man 3 sd_notify pour plus de détails sur les messages reconnus.

Note : de nombreuses applications de service conçues pour être portables sur de nombreux systèmes de type Unix peuvent se comporter comme b) par défaut, mais peuvent être amenées à fonctionner comme a) en ajoutant une option (généralement décrite comme "don't fork", "keep running in foreground", "don't daemonize" ou similaire). Dans ce cas, si l'option n'a pas d'autres effets secondaires, alors l'ajout de l'option et l'utilisation d'un comportement de type a) seraient préférables pour les applications suivantes systemd .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X