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