
複数のインスタンスを持つサービスを用意し、各インスタンスに構成ファイルを持たせ、構成ファイルが表示されたり消えたりすると、それぞれ対応するインスタンスが作成されたり終了したりするようにし、特に、削除されたユニットに対応する実行中のプロセスを強制終了するようにします。
最初は起動できますが、構成ファイルが変更されても停止しません。
私はこれを 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
そして嬉しいことに、4番目のプロセスが現れました。
しかし、今問題が起きる
もし私が であればrm /var/letters/aleph.conf; systemctl daemon-reload
、アレフプロセスは消滅するだろうと予想します。それは違います!構成の変更によって影響を受けないプロセスを強制終了したくないので、サービスを再起動する必要はありません。
何が間違っているのでしょうか? ところで、これは正しいアプローチなのでしょうか? には何も目立った点がなくjournalctl -xe
、これをデバッグする方法がわかりません。
ありがとう!