How to execute scripts in /usr/lib/systemd/system-shutdown/ at reboot or shutdown?
Solution 1
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).
Solution 2
So if you want to run the script during the shutdown of the machine, you need to add a .service file, see: How to run a script with systemd right before shutdown?
/lib/systemd/system-shutdown/
is reserved for special cases and is executed at the very end of the shutdown/reboot procedure
Related videos on Youtube
Frank Breitling
Updated on September 18, 2022Comments
-
Frank Breitling over 1 year
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.
-
Bigon about 7 yearsIs your script executable? What are you exactly trying to do?
-
Frank Breitling about 7 years> "My script is described at How to run a script at shutdown on Debian 9 or Raspbian 8 (Jessie)."
-
Bigon about 7 yearsOK, so you are really trying to do a
touch
. This will definitely not work as the filesystems are already remounted read-only I think -
don_crissti about 7 years@Bigon - exactly
-
Frank Breitling about 7 yearsAlright, I can confirm that the read-only mount was in fact the problem by adding
mount -oremount,rw /
andmount -oremount,ro /
before and after the touch.
-
-
Frank Breitling about 7 yearsBut why can't I just link my script to the
/etc/rc6.d
folder as attempted but failing here. Is a .service file the only option with systemd? -
Bigon about 7 yearsI think you'll have to put some headers in your script, see: wiki.debian.org/LSBInitScripts
-
Frank Breitling about 7 yearsMy understanding was that this header is just to manage the order in which the scripts are executed with programs like
update-rc.d
. I have also tried it with headers, one waiting for rsyslog and one without dependencies but no success either. So I removed it from my minimal example since it should have no effect on the execution. -
Bigon about 7 yearsWith systemd the
systemd-sysv-generator
creates temporary .service files on the fly (and store them in/run/systemd
) for each LSB initscripts that are not masked by a real native .service. I think that this requires the LSB headers