Wie starte und stoppe ich ein System mit einem anderen?

20

Ich benutze CoreOS, um systemd Einheiten mit Flotte zu planen. Ich habe zwei Einheiten ( firehose.serviceund firehose-announce.serviceich versuche, das firehose-announce.servicezu starten und zu stoppen zusammen mit dem firehose.service. Hier ist die Einheitendatei 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, BindsTomit dem Begriff zu verwenden, dass Start und Stopp von firehose.serviceauch starten oder stoppen firehose-announce.service. Das passiert aber nie richtig. Wenn firehose.servicegestoppt ist, firehose-announce.servicegeht es in den fehlerhaften Zustand. Aber wenn ich anfange firehose.service, firehose-announce.servicestartet der nicht.

Was mache ich hier falsch?

Andy Shinn
quelle
Selbes Problem hier. Haben Sie eine Lösung gefunden?
Nahime

Antworten:

24

Ich scheine endlich über die richtige Kombination gestolpert zu sein, um dies wie gewünscht zum Laufen zu bringen.

In meinem firehose-announce.serviceGerät stelle ich 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

Dadurch firehose-announce.servicestoppt das Gerät, wenn dies der firehose.serviceFall ist. Groß. Aber wie fangen wir es wieder an?

Ich kehre die Abhängigkeit um, um in meiner firehose.serviceEinheit zu sein:

[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

Dieser sagt , dass firehose.servicewill firehose-announce.servicebis beginnen , wenn es funktioniert (aber nicht scheitern , wenn firehose-announce.servicenicht gestartet werden kann). Es stellt auch sicher, dass es firehose.servicevorher startet firehose-announce.service.

Ich habe dies getestet und die Einheiten scheinen nun wie gewünscht zusammen anzuhalten und zu starten.

Andy Shinn
quelle
Großartig, ich werde es versuchen.
Nahime
1
Offensichtlich bedeutet Wants = optional. Requires = ist eine Anforderung. BindsTo bedeutet, wenn die Abhängigkeit, dh der Firehose-Dienst, endet, wird der Firehose-Announce-Dienst ebenfalls als beendet betrachtet. Hört sich für mich gut an.
Matt
Ist es möglich, dieses Verhalten zu erhalten, ohne firehouse.service zu berühren?
buddy123
Ich habe diese Lösung ausprobiert, bin jedoch auf ein Problem gestoßen. Ich habe Service A mit Requires = B.service und Service B mit BindsTo = A.service. Wenn A abnormal beendet wird, werden A und B neu gestartet. Wenn A mit dem Code 0 / SUCESS beendet wird, bleiben beide im gestoppten Zustand
Bug Killer,
ExecStartPre = {Strich} s -dienen auf dem letzten keinen Zweck und nur Zweck dient auf alle , aber die letzten ExecStartPre
meffect