Frage In Systemd, was ist der Unterschied zwischen After = und Requires =?


Ich erstelle eine Systemdienstdatei und ich brauche Hilfe, um den Unterschied zu verstehen Requires= und After=. Das Man Seite sagt, dass Requires= "Konfiguriert Anforderungsabhängigkeiten für andere Einheiten." und After= "Konfiguriert Bestellabhängigkeiten zwischen Einheiten." Was ist der Unterschied?


36
2017-11-01 20:04


Ursprung




Antworten:


After= konfiguriert Service-Auftrag (tun X nur nach Y), während Requires= Zustandsabhängigkeiten. Wenn Sie keinen Auftrag angeben, wird ein Dienst, der von einem anderen abhängt, gleichzeitig mit dem von ihm abhängigen Dienst gestartet. Auch, wie ich es verstehe (obwohl ich das jetzt nicht testen kann und keine Referenz finde), After= ist eine "lose Kopplung", und ein Dienst mit einer solchen Anweisung würde immer noch laufen, wenn der in der After= Zeile wird überhaupt nicht gestartet, während Require= würde verhindern, dass es gestartet wird, wenn die Anforderung nicht erfüllt wird.

Zitieren https://www.freedesktop.org/software/systemd/man/systemd.unit.html:

Benötigt =

Konfiguriert Anforderungsabhängigkeiten für andere Einheiten. Wenn dieses Gerät aktiviert wird, werden die hier aufgeführten Einheiten ebenfalls aktiviert. Wenn eine der anderen Einheiten deaktiviert wird oder ihre Aktivierung fehlschlägt, wird diese Einheit deaktiviert. Diese Option kann mehrmals angegeben werden, oder es können mehrere durch Leerzeichen getrennte Einheiten in einer Option angegeben werden. In diesem Fall werden Anforderungsabhängigkeiten für alle aufgelisteten Namen erstellt. Beachten Sie, dass Anforderungsabhängigkeiten nicht die Reihenfolge beeinflussen, in der Dienste gestartet oder gestoppt werden. Dies muss unabhängig mit den Optionen After = oder Before = konfiguriert werden. Wenn eine Einheit foo.service eine Einheit bar.service erfordert, wie sie mit Requires = konfiguriert wurde und keine Reihenfolge mit After = oder Before = konfiguriert ist, werden beide Einheiten gleichzeitig und ohne Verzögerung zwischen ihnen gestartet, wenn foo.service aktiviert ist. Oft ist es eine bessere Wahl, Wants = anstelle von Requires = zu verwenden, um ein System zu erreichen, das bei fehlgeschlagenen Diensten robuster ist.

und

Vorher =, Nach =

Eine durch Leerzeichen getrennte Liste von Einheitennamen. Konfiguriert Bestellabhängigkeiten zwischen Einheiten. Wenn eine Einheit foo.service eine Einstellung Before = bar.service enthält und beide Einheiten gestartet werden, wird der Start von bar.service verzögert, bis foo.service gestartet wird. Beachten Sie, dass diese Einstellung unabhängig von und orthogonal zu den Anforderungsabhängigkeiten ist, die von Requires = konfiguriert wurden. Es ist ein gängiges Muster, einen Einheitennamen in die Option After = und Requires = aufzunehmen. In diesem Fall wird die aufgelistete Einheit vor der Einheit gestartet, die mit diesen Optionen konfiguriert ist. Diese Option kann mehrmals angegeben werden. In diesem Fall werden Bestellabhängigkeiten für alle aufgelisteten Namen erstellt. After = ist das Inverse von Before =, d.h. während After = sicherstellt, dass die konfigurierte Einheit gestartet wird, nachdem die aufgelistete Einheit das Starten beendet hat, stellt Before das Gegenteil sicher, d. H. Dass die konfigurierte Einheit vollständig gestartet wird, bevor die gelistete Einheit gestartet wird. Beachten Sie, dass wenn zwei Einheiten mit einer Reihenfolgeabhängigkeit zwischen ihnen heruntergefahren werden, die Umkehrung der Startfolge angewendet wird. wenn eine Einheit mit After = auf einer anderen Einheit konfiguriert ist, wird die erstere vor der letzteren angehalten, wenn beide abgeschaltet sind. Bei zwei Einheiten mit beliebiger Reihenfolgeabhängigkeit wird, wenn eine Einheit heruntergefahren und die andere gestartet wird, die Abschaltung vor der Inbetriebnahme angeordnet. Es spielt keine Rolle, ob die Reihenfolgeabhängigkeit After = oder Before = ist. Es spielt auch keine Rolle, welcher der beiden ausgeschaltet ist, solange einer ausgeschaltet ist und der andere gestartet ist. Das Herunterfahren wird in allen Fällen vor dem Start geordert. Wenn zwei Einheiten keine Bestellabhängigkeiten zwischen ihnen haben, werden sie gleichzeitig heruntergefahren oder gestartet und es findet keine Bestellung statt.


25
2017-11-01 20:25



Was ist eine Abhängigkeit, wenn nicht eine Aussage zur Ordnung? (Ernst ... ich verstehe den Unterschied nicht) - TomOnTime
Siehe meine Bearbeitung. Mein Verständnis: After=X würde bedeuten "Tu dies nach X ob X ist fertig ", während Require=X würde bedeuten "Tu das überhaupt nicht, wenn du X nicht kannst". - Sven♦
Das Before= Der Abschnitt der Manpage scheint dies zu bestätigen. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up  So wie ich das verstehe, würde die Bestellung nicht erzwungen, wenn bar.service ist sowieso nicht gestartet und foo.service würde normal anfangen. - Sven♦


Einer der wichtigsten Unterschiede ist,

  • After überprüft nur, ob die Einheit bereits aktiviert ist und aktiviert nicht explizit die angegebenen Einheiten.
  • Die Einheiten in Requires werden zusammen mit der Einheit aktiviert. Wenn eine der erforderlichen Einheiten nicht startet, wird die Einheit nicht aktiviert.

Überlege, ich habe eine Unit-Datei test-app.service,

[Unit]
Description=test app
After=network-online.target

Was passiert, wenn diese Anweisung ausgeführt wird?

  • After prüft ob network-online.target.
  • ob network-online.target nicht gestartet, es wird warten.
  • test-app beginnt erst nach network-online.target ist aktiv

Hätte ich Requires stattdessen,

[Unit]
Description=test app
Requires=network-online.target

Was passiert, wenn diese Anweisung ausgeführt wird?

  • network-online.target und test-app werden zusammen aktiviert
  • ob network-online.target startet nicht test-app wird nicht aktiviert.

0
2017-09-18 00:43