
각 인스턴스에 구성 파일이 있는 여러 인스턴스가 있는 서비스를 갖고 싶습니다. 구성 파일이 나타나고 사라질 때 해당 인스턴스가 각각 생성되고 죽기를 원하며, 특히 제거된 장치에 해당하는 실행 중인 프로세스가 종료되도록 하고 싶습니다.
처음에는 시작하도록 할 수 있지만 구성 파일이 변경되면 중지되지 않습니다.
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
디버깅을 진행하는 방법을 모르겠습니다.
감사해요!