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알레프 프로세스가 죽을 것으로 예상합니다.그렇지 않습니다!구성 변경의 영향을 받지 않는 프로세스를 종료하고 싶지 않기 때문에 서비스를 다시 시작하고 싶지 않습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까? 그렇다면 이것이 올바른 접근 방식일까요? 에서는 눈에 띄는 것이 없으며 journalctl -xe디버깅을 진행하는 방법을 모르겠습니다.

감사해요!

관련 정보