Während Umuts Antwort richtig ist, gibt es eine Interaktion zwischen Requires= und After= das wird selten ausgesprochen. Aus systemd.unit#Requires=(Hervorhebung von mir):
Wenn diese Einheit aktiviert wird, werden die aufgelisteten Einheiten ebenfalls aktiviert. Wenn eine der anderen Einheiten nicht aktiviert werden kann, und eine Ordnungsabhängigkeit After= auf das fehlerhafte Gerät eingestellt ist , wird dieses Gerät nicht gestartet.
Im Wesentlichen bedeutet dies, dass ohne After= , werden beide Dienste gestartet, wenn foo.service gestartet wird (wegen Requires= ), aber systemd stoppt foo.service nicht wenn bar.service startet nicht erfolgreich.
Allerdings mit dem Zusatz After= , es wird auf bar.service gewartet erfolgreich zu starten (mit einigen Ausnahmen; siehe Hinweis im Requires= docs), bevor es foo.service startet und wird es nicht starten, wenn bar.service startet nicht.
Etwas verwandt ist der Unterschied zwischen Requires= und BindsTo= (Siehe die Dokumentation um den Link oben).
Es ist vollkommen in Ordnung, beide After= zu verwenden und Requires= . Sie haben unterschiedliche Zwecke. Requires= richtet eine Startabhängigkeit ein. systemd stellt sicher, dass jeder, der versucht, foo.service zu starten, auch bar.service starten sollte. Sollte bar.service irgendwann ausfallen, wird auch foo.service heruntergefahren.
After= setzt eine Startreihenfolge zwischen den Diensten. Wenn der Start beider Dienste geplant ist, dann After= stellt sicher, dass die Startreihenfolge festgelegt ist.
Als Beispiel können Sie sich die eigene Servicedatei von systemd ansehen.
/lib/systemd/system/basic.target
[Unit]
...
Requires=sysinit.target
After=sysinit.target
...