Bagaimana cara memulai dan menghentikan unit systemd dengan yang lain?

20

Saya menggunakan CoreOS untuk menjadwalkan unit systemd dengan armada. Saya memiliki dua unit ( firehose.servicedan firehose-announce.service. Saya mencoba firehose-announce.serviceuntuk memulai dan berhenti bersama dengan firehose.service. Ini adalah file unit untuk 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

Saya mencoba menggunakan BindsTodengan gagasan bahwa mulai dan berhenti firehose.servicejuga akan mulai atau berhenti firehose-announce.service. Tetapi ini tidak pernah terjadi dengan benar. Jika firehose.servicedihentikan, maka firehose-announce.servicemasuk ke kondisi gagal. Tetapi ketika saya mulai firehose.service, firehose-announce.serviceitu tidak memulai.

Apa yang saya lakukan salah di sini?

Andy Shinn
sumber
Masalah yang sama disini. Sudahkah Anda menemukan solusinya?
nahime

Jawaban:

24

Sepertinya saya akhirnya menemukan kombinasi yang tepat untuk membuat ini berfungsi seperti yang diinginkan.

Di firehose-announce.serviceunit saya, saya hanya mengatur a BindsTo. Seluruh unit adalah:

[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

Ini akan menyebabkan firehose-announce.serviceunit berhenti ketika firehose.serviceitu. Besar. Tapi bagaimana kita memulainya lagi?

Saya membalik ketergantungan untuk berada di firehose.serviceunit saya seperti:

[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

Ini mengatakan bahwa firehose.serviceingin firehose-announce.servicememulai ketika itu terjadi (tapi jangan gagal jika firehose-announce.servicetidak bisa memulai). Itu juga memastikan firehose.servicedimulai sebelumnya firehose-announce.service.

Saya menguji ini dan unit sekarang tampaknya berhenti dan mulai bersama seperti yang diinginkan.

Andy Shinn
sumber
Bagus, saya akan mencobanya.
nahime
1
Tampaknya, Mau = berarti opsional. Membutuhkan = adalah persyaratan. BindsTo berarti jika ketergantungan yaitu layanan firehose berhenti maka layanan mengumumkan firehose dianggap berhenti juga. Kedengarannya seperti hal yang baik bagi saya.
Matt
Apakah mungkin untuk mendapatkan perilaku ini tanpa menyentuh Firehouse.service?
buddy123
Saya mencoba solusi ini, tetapi saya mengalami satu masalah. Saya memiliki layanan A dengan Membutuhkan = B.service dan layanan B dengan BindsTo = A.service. Ketika A keluar secara tidak normal, saya melihat A dan B mulai ulang. Tetapi ketika A keluar dengan kode 0 / SUKSES, keduanya tetap dalam status berhenti
Bug Killer
ExecStartPre = {dash} -tidak melayani tujuan pada yang terakhir dan hanya melayani tujuan pada semua kecuali ExecStartPre terakhir
meffect