Systemd est un gestionnaire d'emploi. La page de manuel n’est pas très précise sur le fonctionnement des choses.
Lorsque vous démarrez, ce que systemd construit est une transaction comprenant des travaux pour le travail d'ancrage (par exemple, le travail de démarrage pour default.target). Toutes ces dépendances et relations définissent comment et quels travaux seront déclenchés. La commande définit le ou les travaux que chaque travail attendra. L'unité default.target est donc au centre de tout cela. C'est pourquoi, lorsque vous activez des unités, vous utilisez une dépendance inverse qui, via systemctl, crée un lien symbolique du système de fichiers dénotant une dépendance directe que systemd peut suivre (également pourquoi vous avez besoin de première place). De même, lorsque vous démarrez manuellement une unité, cette unité est ancre et la transaction est calculée.
Sans trop entrer dans les détails, je vais expliquer ce que requiert = et après =.
Requiert = oblige systemd à déclencher un travail de démarrage pour l'unité requise lorsque vous déclenchez un travail de démarrage (explicitement ou par le biais d'une dépendance: il n'y a pas de distinction en interne). Il a également la propriété de déclencher un travail d’arrêt sur vous lorsque cette unité est arrêtée (remarque: arrêtée, ne tombe pas en panne seule) ou redémarrée. Cela signifie que si une dépendance / systemctl provoque son arrêt / redémarrage, vous allez également arrêter / redémarrer. Cependant, si cela se produit tout seul, vous ne vous arrêterez pas, car il n'y avait pas de travail, et le changement d'état a eu lieu sans l'implication de systemd. C'est là que vous utiliseriez BindsTo = (similaire aux unités de périphériques, qui peuvent passer en mode inactif sans la participation de systemd, pour des raisons évidentes).
Maintenant, l'utilisation de After = est recommandée car Requise = alone est racé pour ce qu'elle fait: annulez l'exigence si le travail de démarrage échoue. Cette annulation ne fonctionne cependant que sur les tâches. En d’autres termes, si l’autre unité ne définit pas la commande, Systemd les déclenche en parallèle et si sa tâche de démarrage se termine avant l’échec de votre tâche de démarrage, elle ne sera pas annulée (elle ne peut pas être annulée, en fait). . L'utilisation de After = signifie qu'un autre travail continue à attendre jusqu'à ce que le travail de démarrage de l'unité requise soit terminé. Selon le résultat, en cas d'échec, le travail de démarrage en attente de votre unité est annulé avec le résultat du travail JOB_DEPENDENCY (pourquoi vous utilisez jaune [DEPEND] au démarrage pour de tels cas). Par conséquent, cet effet d'invalidation est indéterministe sans l'utilisation de After =.
C’est pourquoi utiliser Wants = without After = convient si vous ne souhaitez pas attendre le démarrage de l’autre unité: il n’y a pas d’invalidation, il n’ya donc pas de course. Dans ce cas, il ne s’agit que d’un mécanisme de synchronisation.
En outre, vous pouvez également activer les deux au démarrage, sans vous imposer, et définir uniquement un ordre. Dans ce cas, lorsque les deux sont extraits dans le cadre de la même transaction, ils sont commandés (ou si le travail de l'autre est déclenché tant que le travail de l'unité pour laquelle il souhaite s'exécuter est en cours d'exécution, il attendra d'abord qu'il se termine, à travers les transactions).
Maintenant, s'il n'y a pas de travail, la commande n'a aucun effet pour ladite unité. Cependant, il existe généralement un travail résultant des dépendances telles que Requiert = et Wants =, ou les deux sont arrêtés à la fois et définissent un ordre, auquel cas ils attendent sur le ou les travaux d'une autre unité.