systemd:在文件系统以只读方式安装后关闭时运行脚本

systemd:在文件系统以只读方式安装后关闭时运行脚本

在文件系统重新挂载为只读后,有没有办法在关闭时运行脚本?

我有一个连接到无线插座的树莓派,我可以通过发送器和脚本对其进行控制。在文件系统以只读方式安装后,我想在关机时关闭该套接字(关闭树莓派电源)。

我试过这个:

[Unit]
Description=Test
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/test
KillMode=none

[Install]
WantedBy=halt.target

脚本 /test 确实输出当前安装。当它在关闭时运行时,它表示根文件系统是读/写状态,而不是预期的只读状态。

编辑:

/测试的内容:

#!/bin/bash

echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1

关机时屏幕输出:

在此输入图像描述

答案1

我找到了一个可靠的解决方案:只需将脚本放在 /usr/lib/systemd/system-shutdown/ 中即可。

也可以看看: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",具体取决于所选操作。该目录中的所有可执行文件都是并行执行的,并且在所有可执行文件完成之前不会继续执行操作。

答案2

关于您的原始脚本,它通常在halt.target之前运行(注意您没有在halt.target之前订购它) - 并且文件系统在那时永远不会重新安装。 systemd-shutdown(systemd 在最后执行 - 到达halt.target后),杀死东西(可能与您的未排序脚本一起=)),运行最终的umount/swapoff/losetup,重新安装不可能的东西umounted,然后从系统关闭目录中并行运行,然后尝试将pivot_root()放入/run/initrams(如果存在关闭)(如果不存在或pivot失败,则继续停止)。

相关内容