systemd: ¿cómo creo/destruyo instancias dinámicamente cuando los archivos de configuración aparecen/desaparecen?

systemd: ¿cómo creo/destruyo instancias dinámicamente cuando los archivos de configuración aparecen/desaparecen?

Quiero tener un servicio con varias instancias, cada una de las cuales tenga un archivo de configuración; cuando los archivos de configuración aparecen y desaparecen, quiero que se cree y muera la instancia correspondiente, respectivamente, y en particular que se eliminen los procesos en ejecución correspondientes a las unidades eliminadas.

Puedo hacer que se inicien la primera vez, pero no se detienen cuando cambian los archivos de configuración.

Intenté modelar esto según lo que hace OpenVPN:

En /etc/systemd/system/letters.service:

[Unit]
Description=Letters service
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/var/tmp/letters

[Install]
WantedBy=multi-user.target

En :/etc/systemd/system/[email protected]

[Unit]
Description=Letters for %i
PartOf=letters.service
ReloadPropagatedFrom=letters.service
Before=systemd-user-sessions.service
After=syslog.target network-online.target
Wants=network-online.target

[Service]
Type=simple
PrivateTmp=false
WorkingDirectory=/var/tmp/letters
ExecStart=/usr/local/bin/letter --daemon --pidfile /run/letters/%i.pid
PIDFile=/run/letters/%i.pid
ExecReload=/bin/kill -HUP $MAINPID
DeviceAllow=/dev/null rw
ProtectSystem=true
ProtectHome=true

[Install]
WantedBy=multi-user.target

En /etc/systemd/system-generators/letters:

#!/bin/sh
exec 2>> /tmp/opg2
set -eux
GENDIR="$1"
WANTDIR="$1/letters.service.wants"
SERVICEFILE="/lib/systemd/system/[email protected]"
CONFIG_DIR=/var/letters/
mkdir -p "$WANTDIR"
for CONFIG in `cd $CONFIG_DIR; ls *.conf 2> /dev/null`; do
  NAME=${CONFIG%%.conf}
  ln -s "$SERVICEFILE" "$WANTDIR/letters@$NAME.service"
done
exit 0

Ahora a divertirnos:

# touch /var/letters/aleph.conf /var/letters/e.conf /var/letters/zeta.conf

# systemctl enable letters.service
Created symlink /etc/systemd/system/multi-user.target.wants/letters.service → /etc/systemd/system/letters.service.

# ls -l /run/systemd/generator/letters.service.wants/
total 0
lrwxrwxrwx 1 root root 36 Mar 17 05:47 [email protected] -> /lib/systemd/system/[email protected]
lrwxrwxrwx 1 root root 36 Mar 17 05:47 [email protected] -> /lib/systemd/system/[email protected]
lrwxrwxrwx 1 root root 36 Mar 17 05:47 [email protected] -> /lib/systemd/system/[email protected]

# systemctl start letters.service
# ps ax | grep letter
14118 ?        S      0:00 /usr/local/bin/letter --daemon --pidfile /run/letters/aleph.pid
14125 ?        S      0:00 /usr/local/bin/letter --daemon --pidfile /run/letters/zeta.pid
14126 ?        S      0:00 /usr/local/bin/letter --daemon --pidfile /run/letters/e.pid

Hasta ahora, todo bien.

Ahora:

# touch /var/letters/tcha.conf
# systemctl daemon-reload
# systemctl start letters.service

Y felizmente apareció un cuarto proceso.

pero ahora empieza el problema

Si lo hago rm /var/letters/aleph.conf; systemctl daemon-reload, espero que el proceso aleph muera.¡No es asi!No quiero tener que reiniciar el servicio porque no quiero eliminar los procesos que no se ven afectados por el cambio de configuración.

¿Qué estoy haciendo mal? De hecho, ¿es éste siquiera el enfoque correcto? No destaca nada journalctl -xey no sé cómo proceder para depurarlo.

¡Gracias!

información relacionada