在檔案系統重新掛載為唯讀後,有沒有辦法在關閉時執行腳本?
我有一個連接到無線插座的樹莓派,我可以透過發送器和腳本對其進行控制。在檔案系統以唯讀方式安裝後,我想在關機時關閉該套接字(關閉樹莓派電源)。
我試過這個:
[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,重新安裝不可能的東西卸載,然後從系統關閉目錄並行運行,然後嘗試將pivot_root()放入/run/initrams(如果存在關閉)(如果不存在或pivot失敗,則繼續停止)。