Bien que la réponse d'Umut soit correcte, il existe une interaction entre Requires=
et After=
qui est rarement précisé. De systemd.unit#Requires=(c'est moi qui souligne) :
Si cette unité est activée, les unités listées seront également activées. Si l'une des autres unités ne parvient pas à s'activer, et une dépendance de commande
After=
sur l'unité défaillante est défini , cette unité ne démarrera pas.
Essentiellement, cela signifie que sans After=
, les deux services seront démarrés si foo.service
est lancé (à cause de Requires=
), mais systemd n'arrêtera pas foo.service
si bar.service
ne démarre pas correctement.
Cependant, avec l'ajout de After=
, il attendra bar.service
démarrer avec succès (à quelques exceptions près ; voir la note dans le Requires=
docs) avant qu'il ne commence foo.service
et ne le démarrera pas si bar.service
ne démarre pas.
La différence entre Requires=
est quelque peu liée et BindsTo=
(voir les docs autour du lien ci-dessus).
Il est parfaitement correct d'utiliser à la fois After=
et Requires=
. Ils ont des objectifs différents. Requires=
définit une dépendance de démarrage. systemd s'assure que si quelqu'un essaie de démarrer foo.service, il doit également démarrer bar.service. Si bar.service échoue à un moment donné, alors foo.service est également supprimé.
After=
met un ordre de démarrage entre les services. Si les deux services doivent démarrer, alors After=
s'assure que l'ordre de démarrage est défini.
Vous pouvez consulter le propre fichier de service de systemd à titre d'exemple.
/lib/systemd/system/basic.target
[Unit]
...
Requires=sysinit.target
After=sysinit.target
...