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?


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.


Ś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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.