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?


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.