Jak uruchomić i zatrzymać jednostkę systemową za pomocą innej?

20

Korzystam z CoreOS, aby planować jednostki systemowe z flotą. Mam dwie jednostki ( firehose.servicei firehose-announce.service. Próbuję firehose-announce.serviceuruchomić i zatrzymać wraz z firehose.service. Oto plik jednostki dla 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

Staram się używać BindsToz pojęciem, że uruchomienie i zatrzymanie firehose.servicerównież się uruchomi lub zatrzyma firehose-announce.service. Ale to nigdy nie dzieje się poprawnie. Jeśli firehose.servicezostanie zatrzymany, firehose-announce.serviceprzejdzie w stan awarii. Ale kiedy zaczynam firehose.service, firehose-announce.servicenie uruchamia się.

Co ja tu robię źle?

Andy Shinn
źródło
Mam ten sam problem. Znalazłeś rozwiązanie?
nahime,

Odpowiedzi:

24

Wydaje mi się, że w końcu natknąłem się na prawidłową kombinację, aby uzyskać to, co trzeba.

W mojej firehose-announce.servicejednostce ustawiłem tylko BindsTo. Cała jednostka to:

[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

Spowoduje to firehose-announce.servicezatrzymanie urządzenia, kiedy to nastąpi firehose.service. Świetny. Ale jak możemy zacząć od nowa?

Odwracam zależność, aby być w mojej firehose.servicejednostce tak:

[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

To znaczy, że firehose.servicechce firehose-announce.servicesię uruchomić, kiedy to nastąpi (ale nie zawiedź, jeśli firehose-announce.servicenie można uruchomić). To także zapewnia, że firehose.servicezacznie się wcześniej firehose-announce.service.

Przetestowałem to i wydaje się, że teraz jednostki zatrzymują się i zaczynają razem zgodnie z życzeniem.

Andy Shinn
źródło
Świetnie, spróbuję.
nahime
1
Najwyraźniej Wants = oznacza opcjonalne. Wymaga = jest wymaganiem. BindsTo oznacza, że ​​jeśli zależność, tj. Usługa węży pożarowych zostanie zatrzymana, to usługa zapowiedzi pożaru również zostanie uznana za zatrzymaną. Brzmi dla mnie jak dobra rzecz.
Matt
Czy można uzyskać takie zachowanie bez dotykania firehouse.service?
buddy123
Wypróbowałem to rozwiązanie, ale mam jeden problem. Mam usługę A z wymaga = B. usługa i usługa B z BindsTo = A. usługa. Kiedy A wychodzi nieprawidłowo, widzę, że zarówno A, jak i B zostają ponownie uruchomione. Ale kiedy A kończy działanie z kodem 0 / SUCESS, oba pozostają w stanie zatrzymania
Bug Killer
ExecStartPre = {dash} -nie służy żadnemu celowi na ostatnim i służy tylko celowi na wszystkich oprócz ostatniego ExecStartPre
meffect