Mentre la risposta di Umut è corretta, c'è un'interazione tra Requires=
e After=
che è raramente enunciato. Da systemd.unit#Requires=(la sottolineatura è mia):
Se questa unità viene attivata, verranno attivate anche le unità elencate. Se una delle altre unità non si attiva, e una dipendenza dell'ordine
After=
sull'unità difettosa è impostato , questa unità non verrà avviata.
Essenzialmente, questo significa che senza After=
, entrambi i servizi verranno avviati se foo.service
viene avviato (a causa di Requires=
), ma systemd non fermerà foo.service
se bar.service
non si avvia correttamente.
Tuttavia, con l'aggiunta di After=
, attenderà bar.service
per avviarsi correttamente (con alcune eccezioni; vedere la nota nel Requires=
docs) prima che inizi foo.service
e non lo avvierà se bar.service
non si avvia.
In qualche modo correlata è la differenza tra Requires=
e BindsTo=
(vedi i documenti intorno al link qui sopra).
Va perfettamente bene usare entrambi After=
e Requires=
. Hanno scopi diversi. Requires=
imposta una dipendenza iniziale. systemd si assicura che se qualcuno sta tentando di avviare foo.service, dovrebbe avviare anche bar.service. Se bar.service dovesse fallire a un certo punto, anche foo.service verrà rimosso.
After=
sta mettendo un ordine di inizio tra i servizi. Se è previsto l'avvio di entrambi i servizi, allora After=
si assicura che l'ordine di inizio sia impostato.
Puoi guardare il file di servizio di systemd come esempio.
/lib/systemd/system/basic.target
[Unit]
...
Requires=sysinit.target
After=sysinit.target
...