• Bug#1036568: Design Defect in systemd-poweroff.service (Race Condition)

    From Laurent Bigonville@21:1/5 to [email protected] on Tue Jul 8 17:50:01 2025
    On Mon, 22 May 2023 12:24:15 -0700 Alex Meyer <[email protected]> wrote:

    Hello,

    I'm running Debian bullseye with systemd. I also have installed mdadm
    and nut-server.

    Looking in /lib/systemd/system-shutdown, I see two drop-in files with contents as follows:

    mdadm.shutdown:

    #!/bin/sh
    # We need to ensure all md arrays with external metadata
    # (e.g. IMSM, DDF) are clean before completing the shutdown.
    /sbin/mdadm --wait-clean --scan

    nutshutdown:

    #!/bin/sh
    /sbin/upsmon -K >/dev/null 2>&1 && /sbin/upsdrvctl shutdown

    The man page for systemd-poweroff.service explains that:

    All executables in this directory are executed in parallel

    This is the problem.

    The systemd-shutdown(8) manpage is explicitly saying:

    Shortly before executing the actual system
    power-off/halt/reboot/kexec, systemd-shutdown will run all executables
    in /usr/lib/systemd/system-shutdown/. Those executables are called with
    one argument: either "poweroff", "halt", "reboot", or "kexec", depending
    on the chosen action. All executables in this directory are executed in parallel, *and execution of the action is not continued before all
    executables finished*.

    That means that, during normal shutdown, even if nutshutdown script
    exits, mdadm will have time to finish its job of flushing the metadata.

    Only in case of a shutdown triggered by the fact that the power of the
    UPS is low might indeed cause the power to be cut before mdadm has finished.

    This could be mitigated by using POWEROFF_WAIT to pause the execution of nutshutdown for several seconds, I think.

    There was a problem that could cause the power to be cut if the MODE was
    set to none in /etc/nut/nut.conf, that has been fixed in 2.8.3-1

    Kind regards,

    Laurent Bigonville

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)