systemd es un gerente de trabajo. La página del manual no es muy precisa sobre cómo funcionan las cosas.
Cuando inicia, lo que hace systemd es crear una transacción que comprende trabajos para el trabajo de anclaje (es decir, iniciar el trabajo para default.target). Lo que hacen todas estas dependencias y relaciones es definir cómo y qué trabajos se activarán. Ordenar define qué trabajo (s) esperará cualquier otro trabajo. La unidad default.target, por lo tanto, está en el centro de todo esto, razón por la cual cuando habilita las unidades, utiliza una dependencia inversa que a través de systemctl enable crea un enlace simbólico del sistema de archivos que denota una dependencia directa que systemd puede seguir (también por qué necesita enlaces simbólicos del sistema de archivos en el primer lugar). Similar es cuando inicia manualmente alguna unidad, luego esa unidad es ancla, y la transacción se calcula con ella.
Sin entrar en demasiados detalles, explicaré lo que Requiere = y Después =.
Requiere = hará que systemd active un trabajo de inicio para la unidad requerida cuando se active un trabajo de inicio (explícitamente, o mediante una dependencia: no hay distinción interna). También tiene la propiedad de activar un trabajo de detención cuando esta unidad se detiene (nota: se detuvo, no baja por sí sola) o se reinicia. Esto significa que si alguna dependencia / systemctl hace que se detenga / reinicie, también se detendrá / reiniciará. Sin embargo, si cae solo, no se detendrá, ya que no había trabajo y el cambio de estado se produjo sin la participación del sistema. Ahí es donde usaría BindsTo = (similar a las unidades de dispositivo, que pueden pasar a inactivo sin la participación del sistema, por razones obvias).
Ahora, se recomienda el uso de After = ya que Requiere = solo es rápido para lo que hace: cancele el requerido si falla el trabajo de inicio. Sin embargo, esta cancelación solo funciona en trabajos wrt, es decir, si la otra unidad no define el orden, systemd se dispara en paralelo, y si su trabajo de inicio finaliza antes de que su trabajo de inicio falle, no se cancelará (de hecho, no se puede cancelar) . El uso de After = significa que otro trabajo sigue esperando hasta que finalice el trabajo de inicio de la unidad requerida y, dependiendo del resultado, si falla, el trabajo de inicio de espera de su unidad se cancela con el resultado del trabajo JOB_DEPENDENCY (por qué usa amarillo [DEPEND]) en el arranque para tales casos). Por lo tanto, este efecto de invalidación es indeterminado sin el uso de After =.
Esta es la razón por la que usar Desea = sin Después = está bien si no desea esperar el inicio de la otra unidad: como no hay invalidación allí, entonces no hay carrera. En ese caso, no es más que un mecanismo de sincronización.
Además, también puede habilitar ambos al inicio, y no requerirse entre sí, y solo definir el orden, en ese caso, cuando ambos se extraen como parte de la misma transacción, se ordenarán (o si se activa el trabajo para el otro) mientras se ejecuta el trabajo para la unidad que quiere ejecutar después, primero esperará a que termine, en todas las transacciones).
Ahora, si no hay trabajo, el pedido no tiene efecto para dicha unidad. Sin embargo, generalmente hay un trabajo, como consecuencia del uso de dependencias como Requiere = y Deseos =, o ambos son detenidos a la vez y definen algún orden, en cuyo caso esperan en el trabajo de la otra unidad.