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.