¿Hay alguna forma de ejecutar un script al apagar, después de que el sistema de archivos se vuelva a montar como de solo lectura?
Tengo una Raspberry Pi conectada a una toma inalámbrica, que puedo controlar mediante un remitente y un script. Quiero apagar ese enchufe (apagando la frambuesa) al apagarlo, después de que el sistema de archivos esté montado como de solo lectura.
He probado esto:
[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
El script /test genera los montajes actuales. Cuando se ejecuta al apagar, indica lectura/escritura para el sistema de archivos raíz y no solo lectura como se esperaba.
Editar:
Contenido de /prueba:
#!/bin/bash
echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1
Salida de pantalla al apagar:
Respuesta1
Encontré una solución confiable: simplemente coloque el script en /usr/lib/systemd/system-shutdown/.
Ver también:https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
Inmediatamente antes de ejecutar la parada/apagado/reinicio/kexec del sistema, systemd-shutdown ejecutará todos los ejecutables en /usr/lib/systemd/system-shutdown/ y les pasará un argumento: "halt", "poweroff", "reboot". " o "kexec", dependiendo de la acción elegida. Todos los ejecutables de este directorio se ejecutan en paralelo y la ejecución de la acción no continúa hasta que finalicen todos los ejecutables.
Respuesta2
Con respecto a su script original, generalmente se ejecuta antes de halt.target (tenga en cuenta que no lo ordenó antes de halt.target), y los sistemas de archivos nunca se vuelven a montar en ese momento. systemd-shutdown (a lo que systemd ejecuta al final, después de llegar a halt.target), elimina cosas (posiblemente junto con su secuencia de comandos no ordenada =)), ejecuta final umount/swapoff/losetup, vuelve a montar lo que no pudo ser se desmonta, luego se ejecuta en paralelo desde el directorio de apagado del sistema, luego intenta pivot_root() en /run/initrams si el apagado existe allí (y si no es así o el pivote falla, continúa con la parada).