Planeo alojar varias instancias de la misma aplicación web para clientes que usan systemd
. I gustaría ser capaz de stop
y start
cada instancia de cliente usando systemd
, así como el tratamiento de toda la colección de instancias de los clientes como un único servicio que puede ser detenido e iniciado juntos.
systemd
parece proporcionar los bloques de construcción que necesito usar PartOf
, y los archivos de la unidad de plantilla, pero cuando dejé el servicio principal, el servicio al cliente secundario no se detuvo. ¿Cómo puedo hacer que esto funcione con systemd? Esto es lo que tengo hasta ahora.
El archivo de unidad de los padres, 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
Un archivo de plantilla de unidad llamado app@.service
, utilizado para crear instancias de clientes:
[Unit]
Description=%I Instance of App Web Service
[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal
Mi app-poc.sh
script (Prueba de concepto que solo se imprime en un archivo de registro en un bucle):
#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
echo "The App PoC loop for $@"
sleep 2;
done
Como prueba de concepto, tengo los archivos de la unidad systemd ~/.config/systemd/user
.
Luego inicio el padre y una instancia basada en la plantilla (después systemctl --user daemon-reload
):
systemctl --user start app
systemctl --user start app@customer.service
Al usarlo journalctl -f
, puedo ver que ambos comenzaron y que la instancia del cliente continúa ejecutándose. Ahora espero que cerrar el padre detendrá al hijo (porque lo usé PartOf
), pero no lo hace. Además, iniciar al padre tampoco inicia al hijo como se esperaba.
systemctl --user stop app
¡Gracias!
(Estoy usando Ubuntu 16.04 con systemd 229).
Requires=
en su lugar?