Bir systemd ünitesini diğeriyle nasıl başlatır ve durdururuz?


20

Core sistemli birimleri filo ile programlamak için kullanıyorum. İki birim var ( firehose.serviceve firehose-announce.service. Ben firehose-announce.servicebaşlatmak ve durdurmak ile birlikte almaya çalışıyorum firehose.service. İşte birim dosyası 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

BindsToBaşlangıç ​​ve bitiş noktalarının firehose.serviceda başlayacağı veya durduğu fikriyle kullanmaya çalışıyorum firehose-announce.service. Ancak bu asla doğru bir şekilde gerçekleşmez. Eğer firehose.servicedurdurulur, daha sonra firehose-announce.servicebaşarısız duruma geçer. Ama başladığımda firehose.service, firehose-announce.servicebaşlamıyor.

Burada neyi yanlış yapıyorum?


Burada da aynı problem. Bir çözüm buldun mu?
nahime

Yanıtlar:


24

Nihayet bu çalışmayı istenen şekilde elde etmek için doğru kombinasyon üzerinde tökezledim.

Ünitemde firehose-announce.servicesadece a BindsTo. Tüm birim:

[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

Bu, firehose-announce.serviceünitenin durduğunda durmasına neden firehose.serviceolur. Harika. Ama tekrar nasıl başlatacağız?

Ünitemdeki gibi bağımlılığı tersine çeviriyorum 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

Bu, ne zaman başlamak firehose.serviceistediğini söyler firehose-announce.service(ancak firehose-announce.servicebaşlayamazsa başarısız olmaz). Aynı zamanda daha firehose.serviceönce başlamasını da sağlar firehose-announce.service.

Bunu test ettim ve birimler artık durup istenildiği gibi başlıyor gibi görünüyor.


Harika, deneyeceğim.
nahime

1
Görünüşe göre, İstiyor = isteğe bağlı anlamına gelir. Gerektirir = bir gereksinimdir. BindsTo, bağımlılık yani itfaiye servisi durursa, itfaiye anons hizmeti de durdurulmuş olarak kabul edilir. Bana iyi bir şey gibi geliyor.
Matt

Firehouse.service'e dokunmadan bu davranışı elde etmek mümkün müdür?
buddy123

Bu çözümü denedim, ancak bir sorunla karşılaşıyorum. Require = B.service ile A servisine ve BindsTo = A.service ile B servisine sahibim. A anormal olarak çıktığında, hem A hem de B'nin yeniden başlatıldığını görüyorum. Ancak A kodu 0 / SUCESS ile çıktığında, her ikisi de durdurulmuş durumda kalır
Bug Killer

ExecStartPre = {dash} 'in -sonuncusuna hiçbir amaca hizmet etmediği ve sadece son ExecStartPre hariç tüm amaca hizmet ettiği
meffect
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.