如何与另一个系统单元启动和停止?


20

我正在使用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

我尝试使用BindsTostart和stop也firehose.service将开始或停止的概念firehose-announce.service。但这永远不会正确发生。如果firehose.service停止,则firehose-announce.service进入失败状态。但是当我启动时firehose.servicefirehose-announce.service它不会启动。

我在这里做错了什么?


这里同样的问题。您找到解决方案了吗?
nahime 2014年

Answers:


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.servicefirehose-announce.service在它启动时启动(但如果firehose-announce.service无法启动就不要失败)。它还确保firehose.service从开始firehose-announce.service

我对此进行了测试,现在这些单元似乎可以根据需要停止并一起启动。


太好了,我会尝试的。
nahime 2014年

1
显然,Wants =表示可选。Requires =是一项要求。BindsTo表示如果依赖性(即firehose-service停止),则firehose-announce服务也被视为停止。对我来说听起来不错。
马特

是否有可能在不触摸firehouse.service的情况下获得此行为?
buddy123'9

我尝试了这种解决方案,但遇到了一个问题。我有带有Requires = B.service的服务A和带有BindsTo = A.service的服务B。当A异常退出时,我看到A和B都重新启动。但是,当A以代码0 / SUCESS退出时,它们都保持停止状态
Bug Killer

ExecStartPre = {dash} -在最后一个上无用,仅在最后一个ExecStartPre上有作用
生效
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.