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


20

CoreOSを使用して、フリートでsystemdユニットをスケジュールしています。私は2つのユニットを持っている(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.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 14

1
どうやら、Wants =はオプションを意味します。Requires =は必須です。BindsToは、依存関係、つまりfirehose-serviceサービスが停止すると、firehose-announceサービスも停止したと見なされることを意味します。私にとって良いことのように思えます。
マット

firehouse.serviceに触れることなくこの動作を取得することは可能ですか?
buddy123

この解決策を試しましたが、1つの問題に直面しています。Requires = B.serviceのサービスAとBindsTo = A.serviceのサービスBがあります。Aが異常終了すると、AとBの両方が再起動します。しかし、時に終了コード0 /成功事例のと、両方の停止状態のままに
バグキラー

ExecStartPre = {ダッシュ}のは、-最後には目的を果たしていないとのみ全てが、最後ExecStartPre上の目的を果たす
meffect
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.