i'm moving a group of systemd-controlled server services off of the critical boot path, on Fedora 39.
i build/package the services myself, from .spec (mock or COPR), and need to adapt the specs' systemd-rpm-macros usage.
to get them off the critial path, i've grouped the service in a unit.target, controlled by a unit.timer,
cat /etc/systemd/system/daemon{A,B,C}.service ... [Install] - WantedBy=graphical.target + Also=daemon-group.timer
cat /etc/systemd/system/daemon-group.target [Unit] Description=daemon-group target Wants=daemonA.service daemonB.service daemonC.service After=daemonA.service daemonB.service daemonC.service
[Install] Also=daemon-group.timer
cat /etc/systemd/system/daemon-group.timer [Unit] Description=startup daemon-group After=syslog.target network-online.target
[Timer] OnActiveSec=1s Unit=daemon-group.target
[Install] WantedBy=timers.target
then
systemctl enable --now daemon-group.timer
as intended, the timer unit now controls group start/stop, with ordering deps handled within each daemon{A,B,C}.service unit,
systemctl status daemonA daemonB daemonC | grep indirect Loaded: loaded (/etc/systemd/system/daemonA.service; indirect; preset: disabled) Loaded: loaded (/etc/systemd/system/daemonB.service; indirect; preset: disabled) Loaded: loaded (/etc/systemd/system/daemonC.service; indirect; preset: disabled)
, not via typical direct systemctl of the individual units.
where, e.g.,
cat /usr/lib/rpm/macros.d/macros.systemd ... %systemd_postun_with_restart() \ %{expand:%%{?__systemd_someargs_%#:%%__systemd_someargs_%# systemd_postun_with_restart}} \ if [ $1 -ge 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then \ # Package upgrade, not uninstall \ /usr/lib/systemd/systemd-update-helper mark-restart-system-units %{?*} || : \ fi \ %{nil} ...
cat /usr/lib/systemd/systemd-update-helper ... mark-restart-system-units) [ -d /run/systemd/system ] || exit 0
for unit in "$@"; do systemctl set-property "$unit" Markers=+needs-restart & done wait ;; ...
with this setup, @ shell,
systemctl stop daemon<X>.service
correctly stops a single service.
but
systemctl (re)start daemon<X>.service
fails to release back to prompt
otoh,
systemctl stop daemon<X>.service systemctl restart daemon-group.timer
does. but, appears to restart all services ref'd in the timer group.
on pkg upgrade, i need to properly handle the service/timer controls in the spec.
the original daemon{A,B,C}.spec has systemd-rpm-macros in place for pre-/post install handling, ... BuildRequires: systemd BuildRequires: systemd-rpm-macros %{?systemd_requires} ... %post %systemd_post daemon<X>.service
%preun %systemd_preun daemon<X>.service
%postun %systemd_postun_with_restart daemon<X>.service ...
what's correct systemd unit control usage in this case?
keep post/pre macro invocations referencing the daemon<X>.service ? switch to mixed/sole macro control of daemon-group.timer? or, can't use the macros in this case, and have to use explicit manual control?