Я хочу иметь службу с несколькими экземплярами, каждый из которых имеет файл конфигурации; когда файлы конфигурации появляются и исчезают, я хочу, чтобы соответствующий экземпляр был создан и умер, соответственно, и, в частности, были убиты запущенные процессы, соответствующие удаленным единицам.
Я могу запустить их с первого раза, но они не останавливаются при изменении файлов конфигурации.
Я пробовал смоделировать это после того, что делает OpenVPN:
В /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
В /etc/systemd/system/letters@.service
:
[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
В /etc/systemd/system-generators/letters
:
#!/bin/sh
exec 2>> /tmp/opg2
set -eux
GENDIR="$1"
WANTDIR="$1/letters.service.wants"
SERVICEFILE="/lib/systemd/system/letters@.service"
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
А теперь поразвлечься:
# 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 letters@aleph.service -> /lib/systemd/system/letters@.service
lrwxrwxrwx 1 root root 36 Mar 17 05:47 letters@e.service -> /lib/systemd/system/letters@.service
lrwxrwxrwx 1 root root 36 Mar 17 05:47 letters@zeta.service -> /lib/systemd/system/letters@.service
# 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
Все идет нормально.
Сейчас:
# touch /var/letters/tcha.conf
# systemctl daemon-reload
# systemctl start letters.service
И, к счастью, появился четвертый процесс.
но теперь начинаются проблемы
Если я rm /var/letters/aleph.conf; systemctl daemon-reload
, Я ожидаю, что процесс алеф умрет. Это не! Я не хочу перезапускать службу, потому что не хочу убивать процессы, на которые не влияет изменение конфигурации.
Что я делаю не так? Если на то пошло, это вообще правильный подход? Ничего особенного в journalctl -xe
, и я не знаю, как продолжить отладку этого.
Спасибо!