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
...