다른 장치와 함께 시스템 장치를 시작하고 중지하는 방법은 무엇입니까?


20

CoreOS를 사용하여 시스템 단위를 플릿으로 예약합니다. 나는 두 단위가 ( firehose.service그리고 firehose-announce.service내가 얻을 노력하고 있어요. firehose-announce.service시작과 함께 중지 firehose.service여기에 대한 유닛 파일입니다. 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

BindsTo시작 및 중지 firehose.service시작 또는 중지 개념 을 사용하려고합니다 firehose-announce.service. 그러나 이것은 결코 올바르게 일어나지 않습니다. 경우 firehose.service정지 후 firehose-announce.service실패 상태로 이동합니다. 내가 시작할 때 firehose.service의가 firehose-announce.service시작되지 않습니다.

내가 여기서 뭘 잘못하고 있니?


여기에도 같은 문제가 있습니다. 해결책을 찾았습니까?
nahime

답변:


24

나는 원하는 대로이 작업을 수행하기 위해 올바른 조합을 마침내 찾았습니다.

firehose-announce.service단위 에서는 BindsTo. 전체 단위는 다음과 같습니다.

[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

그러면 firehose-announce.service기기가 멈추게됩니다 firehose.service. 큰. 그러나 어떻게 다시 시작합니까?

나는 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

이것은 시작할 때 시작하고 firehose.service싶다는 말입니다 firehose-announce.service(그러나 firehose-announce.service시작할 수 없으면 실패하지 않습니다 ). 또한 firehose.service전에 시작해야 firehose-announce.service합니다.

나는 이것을 테스트했고 장치는 이제 원하는대로 멈추고 함께 시작하는 것처럼 보입니다.


좋아,해볼 게
nahime

1
분명히 Wants =는 선택 사항을 의미합니다. 요구 사항 =이 요구 사항입니다. BindsTo는 의존성, 즉 firehose-service가 중지되면 firehose-announce 서비스도 중지 된 것으로 간주됩니다. 나에게 좋은 것 같습니다.
Matt

firehouse.service를 건드리지 않고이 동작을 얻을 수 있습니까?
buddy123

이 솔루션을 시도했지만 한 가지 문제가 발생했습니다. Required = B.service의 서비스 A와 BindsTo = A.service의 서비스 B가 있습니다. A가 비정상적으로 종료되면 A와 B가 모두 다시 시작되는 것을 볼 수 있습니다. 그러나 코드 0을 가진 종료는 / 성공은 모두 정지 상태를 유지하는 경우
킬러 버그

ExecStartPre = {대시}의이 -마지막에 어떤 목적을 제공하지 만 모든하지만 마지막 ExecStartPre에 목적을 제공
meffect
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.