Frage Wie starte und stoppe ich eine Systemeinheit mit einer anderen?


Ich verwende CoreOS, um Systemeinheiten mit der Flotte zu planen. Ich habe zwei Einheiten (firehose.service und firehose-announce.service. Ich versuche das zu bekommen firehose-announce.service zusammen mit der firehose.service. Hier ist die Unit-Datei für firehose-announce.service:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service
After=firehose@%i.service
Requires=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

Ich versuche zu benutzen BindsTo mit der Vorstellung, dass Start und Stopp von firehose.service wird auch starten oder stoppen firehose-announce.service. Aber das passiert nie richtig. Ob firehose.service wird dann gestoppt firehose-announce.service geht in den gescheiterten Zustand. Aber wenn ich anfange firehose.service, das firehose-announce.service startet nicht.

Was mache ich hier falsch?


19
2017-08-19 20:27


Ursprung


Selbes Problem hier. Hast du eine Lösung gefunden? - nahime


Antworten:


Ich scheine endlich über die richtige Kombination gestolpert zu sein, um das wie gewünscht funktionieren zu lassen.

In meinem firehose-announce.service Einheit Ich setze nur ein BindsTo. Die gesamte Einheit ist:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

Dies wird dazu führen, dass firehose-announce.service Einheit zu stoppen wann firehose.service tut. Großartig. Aber wie starten wir es wieder?

Ich kehre die Abhängigkeit um, um in meinem zu sein firehose.service Einheit wie folgt:

[Unit]
Description=Firehose server
Wants=firehose-announce@%i.service
Before=firehose-announce@%i.service

[Service]
ExecStartPre=/usr/bin/docker pull firehose/server
ExecStartPre=-/usr/bin/docker rm -f firehose-%i
ExecStart=/usr/bin/docker run --name firehose-%i -p 7474 --env-file /home/core/firehose.env firehose/server
ExecStop=/usr/bin/docker rm -f firehose-%i
User=core
TimeoutStartSec=5m
TimeoutStopSec=20s
RestartSec=30s
Restart=on-failure

[Install]
WantedBy=multi-user.target

[X-Fleet]
X-Conflicts=firehose@*.service

Das sagt das firehose.service will firehose-announce.service starten, wenn es funktioniert (aber nicht scheitern, wenn firehose-announce.service kann nicht starten). Es stellt auch sicher firehose.service beginnt vorher firehose-announce.service.

Ich habe das getestet und die Einheiten scheinen jetzt zu stoppen und zusammen zu starten, wie es gewünscht wird.


23
2017-08-20 14:55



Großartig, ich werde es versuchen. - nahime
Anscheinend bedeutet Wants = optional. Benötigt = ist eine Voraussetzung. BindsTo bedeutet, dass, wenn die Abhängigkeit, d. H. Der Feuerlöschservice stoppt, der Feuerlöschanmeldedienst ebenfalls als angehalten betrachtet wird. Hört sich gut an. - Matt
Ist es möglich, dieses Verhalten zu erreichen, ohne firehouse.service zu berühren? - buddy123
Ich habe diese Lösung ausprobiert, stoße aber auf ein Problem. Ich habe Service A mit Requires = B.service und Service B mit BindsTo = A.service. Wenn A abnormal beendet wird, sehe ich, dass sowohl A als auch B neu gestartet werden. Wenn A jedoch mit dem Code 0 / SUCESS beendet wird, bleiben beide im gestoppten Zustand - Bug Killer
ExecStartPre = {dash} - dienen auf dem letzten keinen Zweck und dienen nur dem Zweck auf allen außer dem letzten ExecStartPre - meffect