複数のインスタンスを一緒に停止/起動するための仮想マシンサービスを作成するには?

複数のインスタンスを一緒に停止/起動するための仮想マシンサービスを作成するには?

を使用する予定です。各顧客インスタンスを使用し、顧客のすべてのインスタンスのコレクションを一緒に停止して開始できる単一のサービスとして処理できるsystemdようにしたいです。stopstartsystemd

systemd私が使用する必要があるビルディングブロックとテンプレート単位のファイルが提供されているようですがPartOf、親サービスを停止しても子クライアントサービスは停止しません。 systemdでこれを行うにはどうすればよいですか?これが私が今まで持っているものです。

親単位ファイルapp.service:

[Unit]
Description=App Web Service

[Service]
# Don't run as a deamon (because we've got nothing to do directly)
Type=oneshot
# Just print something, because ExecStart is required
ExecStart=/bin/echo "App Service exists only to collectively start and stop App instances"
# Keep running after Exit start finished, because we want the instances that depend on this to keep running
RemainAfterExit=yes
StandardOutput=journal

[email protected]顧客インスタンスの作成に使用される単位テンプレートファイル:

[Unit]
Description=%I Instance of App Web Service

[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal

私のapp-poc.shスクリプト(ログファイルを繰り返す概念証明):

#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
  echo "The App PoC loop for $@"
  sleep 2;
done

概念を説明するためにsystemdユニットファイルを~/.config/systemd/user

次に、親インスタンスとテンプレートベースのインスタンスを起動します(後でsystemctl --user daemon-reload)。

systemctl --user start app
systemctl --user start [email protected]

使用すると、journalctl -f両方が起動し、クライアントインスタンスがまだ実行されていることがわかります。親を閉じると、子がブロックされると予想されます。PartOf)しかし、これは本当ではありません。また、親プロセスを開始しても、子プロセスは期待どおりに開始されません。

systemctl --user stop app

ありがとうございます!

(私はUbuntu 16.04とsystemd 229を使用しています)。

答え1

私はこれがシステムの「ターゲットユニット」の目的であることを学びました。標的細胞を使用すると、上記[Service]の偽の部分を作成することなく所望の利点を得ることができます。実際の例「ターゲットデバイス」ファイルは次のとおりです。

# named like app.target
[Unit]
Description=App Web Service

# This collection of apps should be started at boot time.
[Install]
WantedBy=multi-user.target

PartOfその後、各クライアントインスタンスはそのセクションに含まれている必要があります(@meuhが指摘したように)、特定のサービスを処理できるセクションも[Unit]必要です。[Install]enabledisable

# In a file name like [email protected]
[Unit]
Description=%I Instance of App Web Service
PartOf=app.target

[Service]
ExecStart=/home/mark/bin/app-poc.sh %i
Restart=on-failure
StandardOutput=journal

# When the service runs globally, make it run as a particular user for added security
#User=myapp
#Group=myapp

# When systemctl enable is used, make this start when the App service starts
[Install]
WantedBy=app.target

顧客インスタンスを起動し、ターゲットの起動時に起動するには、次のワンタイムアクティベーションコマンドを使用します。

 systemctl enable app

これで、特定のインスタンスでおよびを使用したり、stopすべてのアプリケーションを一緒に使用して停止したりできます。startapp@customerstart appstop app

答え2

行を移動する必要があります。

PartOf=app.service

[Service]このセクションに入り、出て[Unit]実行するクライアントのリストに追加します[Unit]app.service

[email protected] [email protected]

またはSourcejediがコメントで言ったように、Requires=これは同じです。PartOf上記のリストにないサービスを手動で開始して停止したままにすることができます。systemctl --user start [email protected]

関連情報