如何启动和停止与另一个systemd单位?

我正在使用CoreOS来安排系统单元与车队。 我有两个单元( firehose.servicefirehose-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.servicefirehose-announce.service没有启动。

我在这里做错了什么?

    我似乎终于绊倒了正确的组合,得到这个想要的工作。

    在我的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.servicefirehose-announce.service之前启动。

    我testing了这个,现在这个单位好像停下来,按照要求一起开始。