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?


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.