¿Cómo iniciar y detener una unidad systemd con otra?

Pregunta:

Estoy usando CoreOS para programar unidades systemd con fleet. Tengo dos unidades ( firehose.service y firehose-announce.service . Estoy tratando de que firehose-announce.service inicie y se detenga junto con firehose.service . Aquí está el archivo de unidad para 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

Estoy tratando de usar BindsTo con la noción de que el inicio y la detención de firehose.service también iniciará o detendrá firehose-announce.service . Pero esto nunca sucede correctamente. Si firehose.service se detiene, firehose-announce.service pasa al estado fallido. Pero cuando inicio firehose.service , firehose-announce.service no se inicia.

¿Qué estoy haciendo mal aquí?

Respuesta:

Parece que finalmente encontré la combinación correcta para que esto funcione como lo deseaba.

En mi unidad firehose-announce.service BindsTo solo configuro un BindsTo . Toda la unidad es:

[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

Esto hará que la unidad firehose-announce.service detenga cuando lo haga firehose.service . Estupendo. Pero, ¿cómo lo ponemos en marcha de nuevo?

Invierto la dependencia para estar en mi unidad firehose.service así:

[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

Esto significa que firehose.service quiere que firehose-announce.service inicie cuando lo haga (pero no falle si firehose-announce.service no puede iniciarse). También se asegura de que firehose.service inicie antes que firehose-announce.service .

Probé esto y las unidades ahora parecen detenerse y comenzar juntas como se desea.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım