So erstellen Sie eine zusammengesetzte Systemeinheit

796
Martin Mucha

Dort habe ich bestimmte Dienste, die ich normalerweise zusammen beginne: Sagen Sie Zookeeper + Kafka + Elassandra. Gibt es eine Möglichkeit, Composite-Einheiten zu schreiben: Alles beginnt zusammen, alles stirbt zusammen? Das heißt, wenn ich damit anfange, wird es delegieren, alles zu beginnen und umgekehrt. Was wäre der richtige Weg, dies zu tun?

6

2 Antworten auf die Frage

10
grawity

Eine Möglichkeit besteht darin, alle drei Dienste von den verbleibenden zwei Diensten abhängig zu machen Requires=.

  • one.service: Requires=two.service three.service
  • zwei service: Requires=one.service three.service
  • drei. service: etc.

Dadurch wird keine Schleife erstellt - Abhängigkeiten sind unabhängig von der Startreihenfolge.

(Das heißt, Sie sollten ein Before = oder ein After = deklarieren, zB wenn Kafka dem Zooweeper nachlaufen muss.)


Die andere Methode besteht darin, eine .target-Einheit zu erstellen, die von Ihren drei Diensten abhängt und die Dienste PartOf=die Einheit sind. (Leider ist es noch nicht möglich, ConsistsOf = im .target selbst zu haben.)

  • all.target: Requires=one.service two.service three.service
  • one.service: PartOf=all.target
  • usw.

(Auch Sie sollen zusätzlich Abhängigkeiten und Ordnung zwischen den Diensten erklären; nicht nur auf dem .TARGET Start alles verlassen.)

Vielen Dank, ich mag es auf den ersten Blick, dass ich jeden dieser Dienste starten kann und alle in der richtigen Reihenfolge erscheinen werden. Zweitens wird es für Multi-Start-Dienste nützlich sein, die nicht immer zusammen gestartet werden müssen. Danke für beide, ich werde sie benutzen - beide. Martin Mucha vor 5 Jahren 1
4
Filipe Brandenburger

Ja, dafür gibt es mehrere Möglichkeiten.

Die einfachste (das einige der tut, was uou beschreiben, aber nicht alle) ist eine erstellen Zieleinheit und fügen Sie Abhängigkeiten von Ihren Service - Einheiten (zum Beispiel Requires=zookeeper.service kafka.service elassandra.serviceund auch eingestellt After=auf die gleichen Einheiten) . Eine Zieleinheit hilfreich ist alles in Start diese Einheiten zusammen, aber es hilft nicht wirklich, sie alle zusammen zu stoppen (die Verwendung systemctl stopauf der Zieleinheit stoppt nicht ihre Abhängigkeiten.) Es gibt Möglichkeiten, Einheiten anzuhalten, zum Beispiel systemctl isolate multi-user.targetwerden alle Einheiten angehalten, die keine Abhängigkeiten davon sind target, was bedeutet, dass Einheiten, die manuell gestartet werden, gestoppt werden, aber dies ist viel stärker als das Stoppen einer kleinen Gruppe von Einheiten.

Ein besserer Ansatz ist vielleicht die Verwendung der PartOf=Direktive, die genau so ist, wie Sie es beschreiben. Sie können entweder eine "Dummy" -Serviceeinheit erstellen, um alle Services zusammen zu verwalten, oder einen Ihrer Services auswählen und die anderen zu PartOfeinem Service machen.

Sie müssen PartOf=alle Einheiten konfigurieren, die Sie gemeinsam starten und stoppen möchten, in Ihrem Fall zookeeper.service, kafka.service und elassandra.service. Beachten Sie jedoch, dass Sie nicht unbedingt die Service Unit-Dateien selbst ändern müssen (z. B. wenn sie mit der Software selbst in deb- oder rpm-Paketen geliefert werden.) Sie können systemctl editzum Hinzufügen Override-Dateien (die Sie mithilfe von erstellen können ) verwenden ein kleines Konfigurations-Snippet für eine vorhandene Einheit, das es Ihnen leicht macht, PartOf=Beziehungen zwischen Einheiten zu definieren, selbst wenn diese in Dateien definiert sind, die Sie nicht ändern möchten.

Es ist kein Nachher im Ziel erforderlich. Die Architektur ist hier unregelmäßig. JdeBP vor 5 Jahren 1
Vielen Dank auch für Ihre Antwort, nämlich für Einheitenüberschreibungen, davon wusste ich nichts. Vielen Dank! Es ist eine Schande, dass ich nur eine gültige Antwort kennzeichnen kann. Danke nochmal! Martin Mucha vor 5 Jahren 1