systemd: ejecutar un script al apagar después de que los sistemas de archivos estén montados en modo de solo lectura

systemd: ejecutar un script al apagar después de que los sistemas de archivos estén montados en modo de solo lectura

¿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:

ingrese la descripción de la imagen aquí

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).

información relacionada