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 [email protected]
, 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 [email protected]
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?Respuestas:
Necesitas mover la linea
fuera de
[Service]
y dentro de la[Unit]
sección, y añadir a la[Unit]
deapp.service
la lista de clientes para empezar, por ejemplo,o como dijo sourcejedi en los comentarios,
Requires=
lo mismo. Puede mantener losPartOf
servicios podrían dejar de empezar con la mano que no están en la lista anterior, al igual quesystemctl --user start [email protected]
.fuente
PartOf
. Gracias. Voy a manejar los "Deseos" a través de un enlace simbólico, que se convierte en la única acción que debo tomar para activar un nuevo cliente con systemd. Para mi caso de prueba: `ln -s /home/mark/.config/systemd/user/[email protected] / home / mark / .config / systemd / user / app.service.wants / unity @ foo.service`Aprendí que para eso sirven las "Unidades de destino" del sistema. Al usar una Unidad objetivo, obtengo los beneficios que quiero sin necesidad de crear la
[Service]
sección falsa que tenía arriba. Un archivo de ejemplo de trabajo "Unidad de destino" tiene este aspecto:Entonces cada instancia cliente debe incluir
PartOf
en la[Unit]
sección (como fuera puntiagudo por @meuh), y también debe tener una[Install]
sección para queenable
ydisable
funcionará en el servicio específico:Para mostrar la instancia del cliente y hacer que se inicie cuando se inicia el destino, se utiliza este comando de habilitación de una sola vez:
Ahora, en este punto, puedo usar
stop
ystart
seguirapp@customer
para una instancia específica, o puedo usarstart app
ystop app
detener todas las aplicaciones juntas.fuente
systemctl status $(systemctl list-dependencies --plain otp.target)
systemd
podría mejorar la usabilidad aquí. He abierto una solicitud de función para sugerir un estado mejorado para los objetivos.