From: Franck Bui Date: Fri, 23 Jul 2021 09:12:03 +0000 (+0200) Subject: manager: reexecute on SIGRTMIN+25, user instances only X-Git-Tag: v250-rc1~906 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=463aef23a73d7850e0208cf4e96fd448693a755a;p=thirdparty%2Fsystemd.git manager: reexecute on SIGRTMIN+25, user instances only Before this patch, there was no way to request all running user instances for reexecuting. However this can be useful especially during package updates otherwise user instances are never updated and keep running a potentially very old version of the binaries. Now assuming that we have enough priviledge, it's possible to request reexecution of all user instances: systemctl kill --signal=SIGRTMIN+25 "user@*.service" Note that this request is obviously asynchronous as it relies on a signal. Keeping "systemctl kill" as the only interface should be good enough to make this obvious and that's the reason why another interface, such as "systemctl --global daemon-reexec" has not been considered. PID1 already uses SIGTERM for reexecuting hence sending it SIGRTMIN+25 is a nop. --- diff --git a/man/systemd.xml b/man/systemd.xml index fe1719fc181..468edfb2d39 100644 --- a/man/systemd.xml +++ b/man/systemd.xml @@ -585,6 +585,17 @@ for --user instances). + + SIGRTMIN+25 + + Upon receiving this signal the systemd manager will reexecute itself. This + is mostly equivalent to systemctl daemon-reexec except that it will be + done asynchronously. + + The systemd system manager treats this signal the same way as + SIGTERM. + + SIGRTMIN+26 diff --git a/src/core/manager.c b/src/core/manager.c index a3607ea44f6..24dfe9fc06b 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -578,8 +578,7 @@ static int manager_setup_signals(Manager *m) { SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */ SIGRTMIN+23, /* systemd: set log level to LOG_INFO */ SIGRTMIN+24, /* systemd: Immediate exit (--user only) */ - - /* .. one free signal here ... */ + SIGRTMIN+25, /* systemd: reexecute manager */ /* Apparently Linux on hppa had fewer RT signals until v3.18, * SIGRTMAX was SIGRTMIN+25, and then SIGRTMIN was lowered, @@ -2846,6 +2845,10 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t /* This is a nop on init */ break; + case 25: + m->objective = MANAGER_REEXECUTE; + break; + case 26: case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */ manager_restore_original_log_target(m);