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,我不知道如何繼續調試它。

謝謝!

相關內容