systemd:当配置文件出现/消失时,如何动态创建/销毁实例?

systemd:当配置文件出现/消失时,如何动态创建/销毁实例?

我想要一个具有多个实例的服务,每个实例都有一个配置文件;当配置文件出现和消失时,我希望分别创建和消亡相应的实例,特别是杀死与被删除单元相对应的正在运行的进程。

我可以让它们第一次启动,但是当配置文件改变时它们不会停止。

我尝试模仿 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/[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

/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

现在来看看有趣的事情:

# 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

到目前为止,一切都很好。

现在:

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

令人高兴的是,第四个过程出现了。

但现在麻烦来了

如果我rm /var/letters/aleph.conf; systemctl daemon-reload,我预计 aleph 进程将会终止。它不是!我不想重新启动服务,因为我不想终止不受配置更改影响的进程。

我做错了什么? 就此而言,这是否是正确的方法? 没有什么特别突出的journalctl -xe,我不知道如何进行调试。

谢谢!

相关内容