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