Как запустить и остановить системный блок с другим?

Я использую 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 не запускается

Что я здесь не так делаю?

1 ответ

Решение

Я, кажется, наконец-то наткнулся на правильную комбинацию, чтобы заставить это работать как хотелось.

В моем firehose-announce.service Блок я только установить 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,

Я проверил это, и теперь кажется, что блоки останавливаются и запускаются вместе, как хотелось бы.

Другие вопросы по тегам