如何在重启或关机时执行 /usr/lib/systemd/system-shutdown/ 中的脚本?

Fra*_*ing 7 shutdown systemd reboot

根据此答案此错误报告, 您可以简单地将脚本放入

/usr/lib/systemd/system-shutdown/
Run Code Online (Sandbox Code Playgroud)

或在 Debian 中

/lib/systemd/system-shutdown/
Run Code Online (Sandbox Code Playgroud)

让它在重启或关机时执行。从

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

在执行实际系统halt/poweroff/reboot/kexec systemd-shutdown 之前,将运行/usr/lib/systemd/system-shutdown/ 中的所有可执行文件,并向它们传递一个参数:“halt”、“poweroff”、“rebo​​ot” " 或 "kexec",取决于选择的操作。此目录中的所有可执行文件都是并行执行的,并且在所有可执行文件完成之前不会继续执行操作。

我的脚本在How to run a script at shutdown on Debian 9 or Raspbian 8 (Jessie) 中描述为:

#!/bin/sh
touch /test
Run Code Online (Sandbox Code Playgroud)

但是,它似乎无法在我的 Debian 系统上运行,我什至将其报告为bug

Fra*_*ing 6

事实上,脚本正在运行。正如 Bigon 和错误报告中指出的那样,touch只是无法生效,因为在/lib/systemd/system-shutdown/执行脚本时文件系统已经以只读方式挂载。

可以通过在以下之前安装和 fs 读写来证明这一点touch

#!/bin/sh
mount -oremount,rw /
touch /test
mount -oremount,ro /
Run Code Online (Sandbox Code Playgroud)

现在/test重新启动后真的出现了。

但是,这也意味着通过此文件夹运行我的脚本将没有用,因为它发生得太晚了。

为了写入日志文件等,需要通过Bigon建议的服务提前运行脚本。我在How to run a script at shutdown on Debian 9 or Raspbian 8 (Jessie)解释了这一点。