Come avviare e arrestare un'unità systemd con un'altra?


20

Sto usando CoreOS per programmare unità systemd con flotta. Ho due unità ( firehose.servicee firehose-announce.service. Sto cercando di firehose-announce.serviceavviare e arrestare il file insieme a firehose.service. Ecco il file dell'unità per 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

Sto cercando di utilizzare BindsTocon l'idea che anche l'avvio e l'arresto di firehose.serviceinizieranno o si fermeranno firehose-announce.service. Ma questo non succede mai correttamente. Se firehose.serviceviene arrestato, firehose-announce.servicepassa allo stato non riuscito. Ma quando inizio firehose.service, firehose-announce.servicenon si avvia.

Cosa sto facendo di sbagliato qui?


Lo stesso problema qui. Hai trovato una soluzione?
nahime,

Risposte:


24

Sembra che alla fine mi sia imbattuto nella combinazione corretta per farlo funzionare come desiderato.

Nella mia firehose-announce.serviceunità ho impostato solo a BindsTo. L'intera unità è:

[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

Ciò causerà l' firehose-announce.servicearresto dell'unità quando lo firehose.servicefa. Grande. Ma come possiamo riavviarlo?

Invertisco la dipendenza per essere nella mia firehose.serviceunità in questo modo:

[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

Questo sta dicendo che firehose.servicevuole firehose-announce.serviceavviarsi quando lo fa (ma non fallire se firehose-announce.servicenon può iniziare). Si assicura anche che firehose.serviceinizi prima firehose-announce.service.

Ho provato questo e le unità ora sembrano fermarsi e iniziare insieme come desiderato.


Ottimo, ci proverò.
nahime,

1
Apparentemente, Wants = significa facoltativo. Richiede = è un requisito. Vincoli Significa che se la dipendenza, ad es. Il servizio antincendio, si interrompe, anche il servizio antincendio viene considerato interrotto. Mi sembra una buona cosa.
Matt

È possibile ottenere questo comportamento senza toccare firehouse.service?
buddy123

Ho provato questa soluzione, ma sto riscontrando un problema. Ho il servizio A con Richiede = B.service e il servizio B con BindsTo = A.service. Quando A esce in modo anomalo, vedo riavviare sia A che B. Ma quando A esce con il codice 0 / SUCESS, entrambi rimangono nello stato di arresto
Bug Killer

ExecStartPre = {dash} -non serve a nulla sull'ultimo e serve solo a tutti tranne l'ultimo ExecStartPre
meffect
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.