systemd è un gestore del lavoro. La pagina man non è molto precisa su come funzionano le cose.
Quando si avvia, ciò che fa systemd è creare una transazione comprendente lavori per il lavoro di ancoraggio (ovvero avviare un lavoro per default.target). Ciò che fanno tutte queste dipendenze e relazioni è definire come e quali lavori verranno attivati. L'ordinamento definisce quali lavori dovranno attendere tutti gli altri lavori. L'unità default.target è quindi al centro di tutto ciò, motivo per cui quando si abilitano le unità si usa una dipendenza inversa che attraverso l'abilitazione di systemctl crea un collegamento simbolico del filesystem che indica che un sistema di dipendenza diretta può seguire (anche perché è necessario un link simbolico nel filesystem nel primo posto). Simile è quando si avvia manualmente un'unità, quindi quell'unità è ancora e la transazione viene calcolata.
Non andando troppo nei dettagli, spiegherò cosa richiede = e dopo =.
Richiede = farà sì che systemd avvii un lavoro di avvio per l'unità richiesta quando viene attivato un lavoro di avvio (esplicitamente o attraverso una dipendenza: non c'è distinzione internamente). Ha anche la proprietà di avviare un processo di arresto su di te quando questa unità viene arrestata (nota: arrestata, non andare in giù da sola) o riavviata. Ciò significa che se una dipendenza / systemctl provoca l'arresto / riavvio, si arresterà / riavvierà anche. Tuttavia, se si riduce da solo, non ti fermerai, poiché non c'era lavoro e il cambiamento di stato è avvenuto senza il coinvolgimento di systemd. È qui che dovresti usare BindsTo = (simile alle unità del dispositivo, che possono diventare inattive senza il coinvolgimento di systemd, per ovvi motivi).
Ora, l'uso di After = è raccomandato in quanto richiede = da solo è spinto per quello che fa: annullare il requisito se il processo di avvio ha esito negativo. Questa cancellazione tuttavia funziona solo per lavori, cioè se l'altra unità non definisce l'ordinamento, systemd si innesca entrambi in parallelo e se il suo lavoro di avvio termina prima che il lavoro di avvio fallisca, non verrà annullato (non può essere annullato, in effetti) . L'uso di After = indica che l'altro lavoro continua ad attendere fino al termine del lavoro di avvio dell'unità richiesta e, a seconda del risultato, se fallito, il lavoro di avvio in attesa dell'unità viene annullato con il risultato del lavoro JOB_DEPENDENCY (perché si utilizza il giallo [DEPEND] all'avvio per tali casi). Quindi, questo effetto di invalidazione non è deterministico senza l'uso di After =.
Questo è il motivo per cui usare Wants = senza After = va bene se non vuoi aspettare l'avvio dell'altra unità: poiché non c'è invalidazione lì, quindi non c'è gara. In tal caso, non è altro che un meccanismo di sincronizzazione.
Inoltre, puoi anche abilitare entrambi all'avvio e non richiederci l'un l'altro e definire solo l'ordinamento, in quel caso, quando entrambi vengono estratti come parte della stessa transazione, verranno ordinati (o se il lavoro per l'altro viene attivato mentre il lavoro per l'unità che vuole eseguire dopo è in esecuzione, prima aspetterà che finisca, attraverso le transazioni).
Ora, se non c'è lavoro, l'ordinazione non ha alcun effetto per detta unità. Tuttavia, di solito c'è un lavoro, come conseguenza dell'uso di dipendenze come Richiede = e Vuole =, o entrambi vengono richiamati alla volta e definiscono un ordine, nel qual caso attendono i lavori di un'altra unità.