]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pid1: make clear that $WATCHDOG_USEC is set for the shutdown binary, noone else
authorLennart Poettering <lennart@poettering.net>
Thu, 14 Nov 2024 22:16:19 +0000 (23:16 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Fri, 15 Nov 2024 13:34:06 +0000 (13:34 +0000)
We use the $WATCHDOG_USEC variable for two very closely uses: as part of
the sd_watchdog_enabled() protocol for implementing service watchdogs.
And as part of the protocol between the service manager and
systemd-shutdown across the PID 1 execve() transition during shutdown.

Apparently some exitrds tools got confused by the latter use. Let's
address that by setting $WATCHDOG_PID to 1, in accordance to the
sd_watchdog_enabled() protocol to make clear this is only intended for
PID 1 and nothing else.

Replaces: #35135

src/core/main.c

index 38216fa7a665f6434c24d8ee5c8ffc1f4b12c3b6..172742c76985121215cdb0251adfdd1be2321519 100644 (file)
@@ -1689,6 +1689,11 @@ static int become_shutdown(int objective, int retval) {
         /* Tell the binary how often to ping, ignore failure */
         (void) strv_extendf(&env_block, "WATCHDOG_USEC="USEC_FMT, watchdog_timer);
 
+        /* Make sure that tools that look for $WATCHDOG_USEC (and might get started by the exitrd) don't get
+         * confused by the variable, because the sd_watchdog_enabled() protocol uses the same variable for
+         * the same purposes. */
+        (void) strv_extendf(&env_block, "WATCHDOG_PID=" PID_FMT, getpid_cached());
+
         if (arg_watchdog_device)
                 (void) strv_extendf(&env_block, "WATCHDOG_DEVICE=%s", arg_watchdog_device);