を使用する予定です。各顧客インスタンスを使用し、顧客のすべてのインスタンスのコレクションを一緒に停止して開始できる単一のサービスとして処理できるsystemd
ようにしたいです。stop
start
systemd
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]
enable
disable
# 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
すべてのアプリケーションを一緒に使用して停止したりできます。start
app@customer
start app
stop app
答え2
行を移動する必要があります。
PartOf=app.service
[Service]
このセクションに入り、出て[Unit]
実行するクライアントのリストに追加します[Unit]
。app.service
[email protected] [email protected]
またはSourcejediがコメントで言ったように、Requires=
これは同じです。PartOf
上記のリストにないサービスを手動で開始して停止したままにすることができます。systemctl --user start [email protected]