web-dev-qa-db-ja.com

systemdユニットを別のユニットで起動および停止する方法は?

CoreOSを使用して、フリートでシステム化されたユニットをスケジュールしています。私は2つのユニット(firehose.servicefirehose-announce.serviceを持っています。firehose-announce.servicefirehose.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

firehose.serviceの開始と停止もfirehose-announce.serviceを開始または停止するという概念でBindsToを使用しようとしています。しかし、これは決して正しく起こりません。 firehose.serviceが停止すると、firehose-announce.serviceは障害状態になります。しかし、firehose.serviceを起動すると、firehose-announce.serviceが起動しません。

ここで何が悪いのですか?

20
Andy Shinn

私は最終的に正しい組み合わせを見つけて、これを希望どおりに機能させるようになりました。

私の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の前に始まることも確認します。

私はこれをテストしましたが、ユニットは希望どおりに一緒に停止および開始するように見えます。

26
Andy Shinn