Làm thế nào để bắt đầu và dừng một đơn vị systemd với một đơn vị khác?


20

Tôi đang sử dụng CoreOS để lên lịch các đơn vị systemd với đội tàu. Tôi có hai đơn vị ( firehose.servicefirehose-announce.service. Tôi đang cố gắng firehose-announce.servicebắt đầu và dừng cùng với firehose.service. Đây là tệp đơn vị cho 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

Tôi đang cố gắng sử dụng BindsTovới khái niệm bắt đầu và dừng lại firehose.servicecũng sẽ bắt đầu hoặc dừng lại firehose-announce.service. Nhưng điều này không bao giờ xảy ra chính xác. Nếu firehose.servicedừng lại, sau đó firehose-announce.servicechuyển sang trạng thái thất bại. Nhưng khi tôi bắt đầu firehose.service, firehose-announce.servicenó không khởi động.

Tôi làm gì sai ở đây?


Cùng một vấn đề ở đây. Bạn đã tìm thấy một giải pháp?
nahime

Câu trả lời:


24

Tôi dường như cuối cùng đã vấp vào sự kết hợp chính xác để làm cho điều này làm việc như mong muốn.

Trong firehose-announce.serviceđơn vị tôi chỉ đặt a BindsTo. Toàn bộ đơn vị là:

[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

Điều này sẽ khiến các firehose-announce.serviceđơn vị dừng lại khi firehose.servicenào. Tuyệt quá. Nhưng làm thế nào để chúng ta bắt đầu lại?

Tôi đảo ngược sự phụ thuộc để ở trong firehose.serviceđơn vị của tôi như vậy:

[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

Điều này nói rằng firehose.servicemuốn firehose-announce.servicekhởi động khi có (nhưng đừng thất bại nếu firehose-announce.servicekhông thể bắt đầu). Nó cũng đảm bảo firehose.servicebắt đầu trước firehose-announce.service.

Tôi đã thử nghiệm điều này và các đơn vị dường như dừng lại và bắt đầu cùng nhau như mong muốn.


Tuyệt, tôi sẽ thử nó.
nahime

1
Rõ ràng, Wants = có nghĩa là tùy chọn. Yêu cầu = là một yêu cầu. BindsTo có nghĩa là nếu sự phụ thuộc tức là dịch vụ chữa cháy dừng lại thì dịch vụ thông báo về hỏa hoạn cũng được coi là dừng lại. Âm thanh như một điều tốt cho tôi.
Matt

Có thể có được hành vi này mà không cần chạm vào firehouse.service không?
thân123

Tôi đã thử giải pháp này, nhưng tôi đang gặp phải một vấn đề. Tôi có dịch vụ A với Yêu cầu = B. Dịch vụ và dịch vụ B với BindsTo = A.service. Khi A thoát bất thường, tôi thấy cả A và B được khởi động lại. Nhưng khi A thoát với mã 0 / thành công, cả hai vẫn còn ở trạng thái dừng
Bug killer

ExecStartPre = {dash} -không phục vụ mục đích nào cho mục đích cuối cùng và chỉ phục vụ mục đích trên tất cả trừ ExecStartPre cuối cùng
meffect
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.