systemd: como faço para criar/destruir instâncias dinamicamente quando arquivos de configuração aparecem/desaparecem?

systemd: como faço para criar/destruir instâncias dinamicamente quando arquivos de configuração aparecem/desaparecem?

Quero ter um serviço com várias instâncias, cada uma delas com um arquivo de configuração; quando os arquivos de configuração aparecem e desaparecem, quero que a instância correspondente seja criada e morra, respectivamente, e, em particular, que os processos em execução correspondentes às unidades removidas sejam eliminados.

Consigo fazer com que eles iniciem na primeira vez, mas eles não param quando os arquivos de configuração são alterados.

Tentei modelar isso depois do que o OpenVPN faz:

Em /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

Em :/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

Em /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

Agora vamos à diversão:

# 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

Até agora tudo bem.

Agora:

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

E, felizmente, apareceu um quarto processo.

mas agora o problema começa

Se eu rm /var/letters/aleph.conf; systemctl daemon-reload, espero que o processo Aleph morra.Isso não!Não quero reiniciar o serviço, porque não quero encerrar os processos que não são afetados pela alteração na configuração.

O que estou fazendo de errado? Aliás, essa é a abordagem correta? Nada se destaca journalctl -xee não sei como proceder para depurar isso.

Obrigado!

informação relacionada