Systemd – How to Execute Scripts in /usr/lib/systemd/system-shutdown/ at Reboot or Shutdown

rebootshutdownsystemd

According to this answer
and this bug report
one can simply drop a script in

/usr/lib/systemd/system-shutdown/

or for Debian in

/lib/systemd/system-shutdown/

to have it executed at reboot or shutdown. From

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html:

Immediately before executing the actual system halt/poweroff/reboot/kexec systemd-shutdown will run all executables in /usr/lib/systemd/system-shutdown/ and pass one arguments to them: either "halt", "poweroff", "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.

My script is described at How to run a script at shutdown on Debian 9 or Raspbian 8 (Jessie) as:

#!/bin/sh
touch /test

However, it didn't seem to run on my Debian systems and I even reported it as bug.

Best Answer

In fact, the script is running. As pointed out by Bigon and in the bug report the touch just cannot take effect because the file system is already mounted read-only when the scripts in /lib/systemd/system-shutdown/ are executed.

One can prove this by mounting and fs read-write before the touch:

#!/bin/sh
mount -oremount,rw /
touch /test
mount -oremount,ro /

Now the /test really appears after a reboot.

However, this also means that running my script through this folder will not be useful since it will happen too late.

In order to write to log files etc. one needs to run the script earlier through a service as suggested by Bigon. I explain this at How to run a script at shutdown on Debian 9 or Raspbian 8 (Jessie).

Related Question