]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
units/{user,capsule}@.service: issue daemon-reexec when notify-reloading
authorMike Yuan <me@yhndnzj.com>
Thu, 10 Oct 2024 19:32:17 +0000 (21:32 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 11 Oct 2024 08:36:08 +0000 (10:36 +0200)
Closes #28367 (but not really in the exact form, see below)

We have the problem of restarting all user manager instances
after upgrade. Current approaches involve systemctl kill
with SIGRTMIN+25, which is async and feels rather ugly [1][2];
or systemctl --machine=user@ --user, which requires entering
each user session. Neither is particularly elegant.
Instead, let's just signal daemon-reexec when user@.service
is reloaded from system manager. Our long goal of dropping
daemon-reload in favor of reexec (see TODO) is unlikely to happen
due to user dbus restrictions, but here the synchronization
is done via READY=1.

[1] https://gitlab.archlinux.org/archlinux/packaging/packages/systemd/-/blob/main/systemd.install?ref_type=heads#L37
[2] https://salsa.debian.org/systemd-team/systemd/-/blob/debian/master/debian/systemd.postinst#L24

#28367 would not really work for us now I come to think about it,
because all processes will be reparented to pid1 as soon as
original user manager process exits. This alternative approach
seems good enough for our use case.

units/capsule@.service.in
units/user@.service.in

index f2bb9e3a45a83debb0e44284af6f5cd0dbac3dac..a64298786e4900067060a50e2b77c6326146b7e4 100644 (file)
@@ -23,6 +23,10 @@ StateDirectory=capsules/%i
 RuntimeDirectory=capsules/%i
 LogExtraFields=CAPSULE=%i
 Slice=capsule.slice
+# Reexecute the manager on service reload, instead of reloading.
+# This provides a synchronous method for restarting all user manager
+# instances after upgrade.
+ReloadSignal=RTMIN+25
 KillMode=mixed
 Delegate=pids memory cpu
 DelegateSubgroup=init.scope
index 569546574721709809324a8c30616534a74d6fb6..381ab2a0db54e2e2cde400e2358ce61789f680d3 100644 (file)
@@ -20,6 +20,10 @@ PAMName=systemd-user
 Type=notify-reload
 ExecStart={{LIBEXECDIR}}/systemd --user
 Slice=user-%i.slice
+# Reexecute the manager on service reload, instead of reloading.
+# This provides a synchronous method for restarting all user manager
+# instances after upgrade.
+ReloadSignal=RTMIN+25
 KillMode=mixed
 Delegate=pids memory cpu
 DelegateSubgroup=init.scope