systemd: Wie erstelle/zerstöre ich Instanzen dynamisch, wenn Konfigurationsdateien erscheinen/verschwinden?

systemd: Wie erstelle/zerstöre ich Instanzen dynamisch, wenn Konfigurationsdateien erscheinen/verschwinden?

Ich möchte einen Dienst mit mehreren Instanzen haben, von denen jede über eine Konfigurationsdatei verfügt. Wenn Konfigurationsdateien erscheinen und verschwinden, möchte ich, dass die entsprechende Instanz erstellt bzw. beendet wird und insbesondere die laufenden Prozesse, die den entfernten Einheiten entsprechen, beendet werden.

Ich kann sie beim ersten Mal starten, aber sie stoppen nicht, wenn sich die Konfigurationsdateien ändern.

Ich habe versucht, dies nach dem Vorbild von OpenVPN zu modellieren:

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

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

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

Und jetzt kommt der Spaß:

# 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

So weit, ist es gut.

Jetzt:

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

Und glücklicherweise tauchte ein vierter Prozess auf.

aber jetzt beginnt der Ärger

Wenn ich rm /var/letters/aleph.conf; systemctl daemon-reload, erwarte ich, dass der Aleph-Prozess abbricht.Es tut nicht!Ich möchte den Dienst nicht neu starten müssen, da ich die Prozesse, die von der Konfigurationsänderung nicht betroffen sind, nicht beenden möchte.

Was mache ich falsch? Ist das überhaupt der richtige Ansatz? Nichts fällt auf journalctl -xeund ich weiß nicht, wie ich mit dem Debuggen weitermachen soll.

Danke!

verwandte Informationen