Si bien la respuesta de Umut es correcta, existe una interacción entre Requires=
y After=
que rara vez se explica. De systemd.unit#Requires=(el énfasis es mío):
Si esta unidad se activa, las unidades enumeradas también se activarán. Si una de las otras unidades no se activa, y una dependencia de pedido After=
en la unidad que falla está configurada , esta unidad no se iniciará.
Esencialmente, esto significa que sin After=
, ambos servicios se iniciarán si foo.service
se inicia (debido a Requires=
), pero systemd no detendrá foo.service
si bar.service
no se inicia correctamente.
Sin embargo, con el agregado After=
, esperará a bar.service
para iniciar con éxito (con algunas excepciones; consulte la nota en el Requires=
docs) antes de que comience foo.service
y no lo iniciará si bar.service
no arranca.
Algo relacionado es la diferencia entre Requires=
y BindsTo=
(ver los documentos alrededor del enlace de arriba).
Está perfectamente bien usar ambos After=
y Requires=
. Tienen diferentes propósitos. Requires=
establece una dependencia de inicio. systemd se asegura de que si alguien intenta iniciar foo.service, también debería iniciar bar.service. Si bar.service falla en algún momento, entonces foo.service también se elimina.
After=
está poniendo un orden de inicio entre los servicios. Si ambos servicios están programados para comenzar, entonces After=
se asegura de que el orden de inicio esté establecido.
Puede ver el propio archivo de servicio de systemd como ejemplo.
/lib/systemd/system/basic.target
[Unit]
...
Requires=sysinit.target
After=sysinit.target
...