systemd ist ein Jobmanager. Die Manpage ist nicht sehr genau, wie die Dinge funktionieren.
Wenn Sie booten, erstellt systemd eine Transaktion, die aus Jobs für den Ankerjob besteht (dh start job for default.target). All diese Abhängigkeiten und Beziehungen definieren, wie und welche Jobs ausgelöst werden. Durch die Bestellung wird festgelegt, auf welche (n) Job (s) jeder andere Job wartet. Die default.target-Einheit steht daher im Mittelpunkt all dessen, weshalb Sie beim Aktivieren von Einheiten eine umgekehrte Abhängigkeit verwenden, die durch systemctl enable eine symbolische Dateisystemverknüpfung erzeugt, die eine Vorwärtsabhängigkeit anzeigt, der systemd folgen kann (auch, warum Sie Dateisystemverknüpfungen in der Datei benötigen) erster Platz). Ähnlich ist es, wenn Sie eine Einheit manuell starten, diese Einheit dann Anker ist und die Transaktion für sie berechnet wird.
Ich gehe nicht zu sehr ins Detail und erkläre, was Requires = und After = tun.
Requires = veranlasst systemd, einen Startjob für die erforderliche Einheit auszulösen, wenn Sie einen Startjob ausgelöst bekommen (explizit oder durch eine Abhängigkeit: es gibt intern keine Unterscheidung). Es hat auch die Eigenschaft, einen Stoppjob bei Ihnen auszulösen, wenn dieses Gerät gestoppt (Hinweis: gestoppt, nicht von selbst heruntergefahren) oder neu gestartet wird. Dies bedeutet, dass Sie auch stoppen / neu starten, wenn Abhängigkeiten / systemctl dazu führen, dass sie gestoppt / neu gestartet werden. Wenn es jedoch von selbst ausfällt, werden Sie nicht aufhören, da es keinen Job gab und der Zustandswechsel ohne die Beteiligung von systemd stattfand. Hier würden Sie BindsTo = verwenden (ähnlich wie Geräteeinheiten, die aus offensichtlichen Gründen ohne die Beteiligung von systemd inaktiv werden können).
Jetzt wird die Verwendung von After = empfohlen, da Requires = allein für die jeweiligen Aufgaben von großer Bedeutung ist: Brechen Sie das Require ab, wenn der Startjob fehlschlägt. Dieser Abbruch funktioniert jedoch nur für Aufträge, dh wenn die andere Einheit keine Reihenfolge definiert, löst systemd beides parallel aus, und wenn der Startauftrag endet, bevor der Startauftrag fehlschlägt, wird er nicht abgebrochen (er kann tatsächlich nicht abgebrochen werden). . Die Verwendung von After = bedeutet, dass ein anderer Job so lange wartet, bis der Startjob der gewünschten Einheit beendet ist. Je nach Ergebnis wird der wartende Startjob Ihrer Einheit mit dem Jobergebnis JOB_DEPENDENCY abgebrochen (warum Sie gelb verwenden [DEPEND]). beim Booten für solche Fälle). Daher ist dieser Invalidierungseffekt ohne die Verwendung von After = undeterministisch.
Dies ist der Grund, warum die Verwendung von Wants = ohne After = in Ordnung ist, wenn Sie nicht auf den Start der anderen Einheit warten möchten: Da dort keine Ungültigkeitserklärung vorliegt, gibt es kein Rennen. In diesem Fall handelt es sich lediglich um einen Synchronisationsmechanismus.
Sie können auch beide beim Booten aktivieren und einander nicht benötigen und nur die Reihenfolge definieren. In diesem Fall werden beide im Rahmen derselben Transaktion abgerufen und sortiert (oder wenn der Auftrag für den anderen ausgelöst wird) Während der Job für die Einheit ausgeführt wird, nach der er ausgeführt werden soll, wartet er zunächst transaktionsübergreifend darauf, dass er beendet wird.
Wenn jetzt kein Auftrag vorhanden ist, hat die Bestellung keine Auswirkung auf das betreffende Gerät. In der Regel gibt es jedoch einen Job, da Abhängigkeiten wie Requires = und Wants = verwendet werden oder beide gleichzeitig abgerufen werden und eine bestimmte Reihenfolge definieren. In diesem Fall warten sie auf den Job bzw. die Jobs einer anderen Einheit.