![systemd:在文件系统以只读方式安装后关闭时运行脚本](https://linux22.com/image/76443/systemd%EF%BC%9A%E5%9C%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%BB%A5%E5%8F%AA%E8%AF%BB%E6%96%B9%E5%BC%8F%E5%AE%89%E8%A3%85%E5%90%8E%E5%85%B3%E9%97%AD%E6%97%B6%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC.png)
在文件系统重新挂载为只读后,有没有办法在关闭时运行脚本?
我有一个连接到无线插座的树莓派,我可以通过发送器和脚本对其进行控制。在文件系统以只读方式安装后,我想在关机时关闭该套接字(关闭树莓派电源)。
我试过这个:
[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”、“reboot” " 或 "kexec",具体取决于所选操作。该目录中的所有可执行文件都是并行执行的,并且在所有可执行文件完成之前不会继续执行操作。
答案2
关于您的原始脚本,它通常在halt.target之前运行(注意您没有在halt.target之前订购它) - 并且文件系统在那时永远不会重新安装。 systemd-shutdown(systemd 在最后执行 - 到达halt.target后),杀死东西(可能与您的未排序脚本一起=)),运行最终的umount/swapoff/losetup,重新安装不可能的东西umounted,然后从系统关闭目录中并行运行,然后尝试将pivot_root()放入/run/initrams(如果存在关闭)(如果不存在或pivot失败,则继续停止)。