Я планую розмістити кілька примірників одного веб-додатку для користувачів, які користуються 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
Файл шаблону з іменем app@.service, який використовується для створення екземплярів клієнта:
[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
Для підтвердження концепції, я маю файли системного блоку ~/.config/systemd/user.
Потім запускаю батьківський і екземпляр на основі шаблону (після systemctl --user daemon-reload):
systemctl --user start app
systemctl --user start app@customer.service
З використання journalctl -fя можу побачити, що і почалося, і що екземпляр клієнта продовжує працювати. Тепер я очікую, що відключення батька зупинить дитину (тому що я звикла PartOf), але це не так. Крім того, запуск батька не починає дитину, як очікувалося.
systemctl --user stop app
Спасибі!
(Я використовую Ubuntu 16.04 з systemd 229).
Requires=замість цього?