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


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.