我想要一个具有多个实例的服务,每个实例都有一个配置文件;当配置文件出现和消失时,我希望分别创建和消亡相应的实例,特别是杀死与被删除单元相对应的正在运行的进程。
我可以让它们第一次启动,但是当配置文件改变时它们不会停止。
我尝试模仿 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
,我不知道如何进行调试。
谢谢!