systemd: запуск скрипта при завершении работы после монтирования файловых систем в режиме «только для чтения»

systemd: запуск скрипта при завершении работы после монтирования файловых систем в режиме «только для чтения»

Есть ли способ запустить скрипт при завершении работы, после того как файловая система перемонтирована как доступная только для чтения?

У меня есть raspberry pi, подключенный к беспроводной розетке, которой я могу управлять через отправитель и скрипт. Я хочу выключать эту розетку (выключая raspberry) при выключении, после того как файловая система будет смонтирована только для чтения.

Я попробовал это:

[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) - и файловые системы никогда не перемонтируются ro в этой точке. systemd-shutdown (к которому systemd запускается в самом конце - после достижения halt.target), убивает все (возможно, вместе с вашим неупорядоченным скриптом =) ), запускает final umount/swapoff/losetup, перемонтирует ro то, что не удалось размонтировать, затем параллельно запускает что-то из каталога system-shutdown, затем пытается выполнить pivot_root() в /run/initrams, если shutdown там существует (и если его там нет или pivot не удается, продолжает с halt).

Связанный контент