Як запустити та зупинити системний блок з іншим?


20

Я використовую CoreOS для планування системних підрозділів з флотом. У мене є два одиниці ( firehose.serviceі firehose-announce.service. Я намагаюся firehose-announce.serviceпочати і зупинити разом з firehose.service. Ось файл одиниці для 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

Я намагаюся використати BindsToз поняттям, що початок і зупинка firehose.serviceзапуску також зупиняться або зупиняються firehose-announce.service. Але це ніколи не буває правильно. Якщо firehose.serviceзупинено, то firehose-announce.serviceпереходить у стан, що не відбувся. Але коли я починаю firehose.service, firehose-announce.serviceне запускається.

Що я тут роблю неправильно?


Тут же проблема. Ви знайшли рішення?
nahime

Відповіді:


24

Мені здається, я нарешті натрапив на правильну комбінацію, щоб зробити так, як потрібно.

У своєму firehose-announce.serviceпідрозділі я встановив лише a BindsTo. Весь блок:

[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

Це призведе до того, що firehose-announce.serviceпристрій зупиниться firehose.service. Чудово. Але як ми запустимо його знову?

Я повертаю залежність, щоб бути в моїй firehose.serviceодиниці так:

[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

Це говорить про те, що firehose.serviceхочеться firehose-announce.serviceзапуститися, коли це станеться (але не вийде з ладу, якщо firehose-announce.serviceне може почати). Він також переконується, що firehose.serviceпочинається раніше firehose-announce.service.

Я перевірив це, і одиниці зараз, здається, зупиняються і починаються разом, як бажано.


Чудово, я спробую.
nahime

1
Мабуть, Wants = означає необов’язковість. Потрібно = це вимога. BindsTo означає, що якщо залежність, тобто перешкода служби припиняється, то служба передачі оголошень також вважається припиненою. Мені це здається гарною справою.
Метт

Чи можна отримати таку поведінку, не торкнувшись firehouse.service?
buddy123

Я спробував це рішення, але зіткнувся з однією проблемою. У мене є служба A з вимогами = B.service та служба B з BindsTo = A.service. Коли A виходить ненормально, я бачу, як і A, і B перезапускаються. Але коли A виходить з кодом 0 / SUCESS, обидва залишаються в зупиненому стані
Bug Killer

ExecStartPre = {dash} не -служить меті на останньому, а служить лише цілі для всіх, крім останнього ExecStartPre
meffect
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.