Planuję hostować kilka wystąpień tej samej aplikacji internetowej dla klientów korzystających z niej systemd
. Chciałbym być w stanie stop
i start
każda instancja klient korzystający systemd
, jak również traktując całą kolekcję instancji klienta jako pojedyncze usługi, które mogą być zatrzymywany i uruchamiany razem.
systemd
wydaje się, że zawiera elementy, których potrzebuję PartOf
, i pliki jednostek szablonów, ale poszedłem zatrzymać usługę nadrzędną, podrzędna obsługa klienta nie została zatrzymana. Jak mogę to zrobić z systememd? Oto co mam do tej pory.
Plik jednostki nadrzędnej 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
Plik szablonu jednostki o nazwie [email protected]
, używany do tworzenia instancji klienta:
[Unit]
Description=%I Instance of App Web Service
[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal
Mój app-poc.sh
skrypt (dowód koncepcji, który po prostu drukuje do pliku dziennika w pętli):
#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
echo "The App PoC loop for $@"
sleep 2;
done
Dla potwierdzenia koncepcji mam systemowe pliki jednostek ~/.config/systemd/user
.
Następnie uruchamiam element nadrzędny i instancję na podstawie szablonu (po systemctl --user daemon-reload
):
systemctl --user start app
systemctl --user start [email protected]
Po użyciu journalctl -f
widzę, że oba zostały uruchomione i że instancja klienta nadal działa. Teraz spodziewam się, że wyłączenie rodzica zatrzyma dziecko (bo użyłem PartOf
), ale tak nie jest. Również uruchomienie rodzica nie oznacza uruchomienia dziecka zgodnie z oczekiwaniami.
systemctl --user stop app
Dzięki!
(Używam Ubuntu 16.04 z systememd 229).
Requires=
zamiast tego używać ?Odpowiedzi:
Musisz przesunąć linię
z
[Service]
i do[Unit]
sekcji, a następnie dodaj do[Unit]
zapp.service
listy klientów, aby rozpocząć, nplub jak powiedział sourcejedi w komentarzach,
Requires=
to samo. MożeszPartOf
zatrzymać usługi uruchamiane ręcznie, których nie ma na powyższej liście, npsystemctl --user start [email protected]
.źródło
PartOf
. Dzięki. Zajmę się „Wants” poprzez dowiązanie symboliczne, które staje się pojedynczym działaniem, które muszę podjąć, aby aktywować nowego klienta za pomocą systemd. W moim przypadku testowym: `ln -s /home/mark/.config/systemd/user/[email protected] / home / mark / .config / systemd / user / app.service.wants / unity @ foo.service`Dowiedziałem się, że po to są systemowe „jednostki docelowe”. Korzystając z jednostki docelowej, uzyskuję pożądane korzyści bez potrzeby tworzenia fałszywej
[Service]
sekcji, którą miałem powyżej. Działający przykładowy plik „Jednostka docelowa” wygląda następująco:Następnie każda instancja klienta powinna zostać uwzględniona
PartOf
w[Unit]
sekcji (jak wskazał @meuh), a także powinna mieć[Install]
sekcję, abyenable
idisable
działała na określonej usłudze:Aby przywołać instancję klienta i uruchomić ją po uruchomieniu celu, używana jest ta komenda jednorazowego włączenia:
Teraz w tym momencie mogę używać
stop
istart
włączaćapp@customer
dla konkretnej instancji lub mogę używaćstart app
istop app
zatrzymać wszystkie aplikacje razem.źródło
systemctl status $(systemctl list-dependencies --plain otp.target)
systemd
może to poprawić użyteczność tutaj. Mam otwarte żądania funkcji , które sugerowałyby, poprawę stanu dla celów.