Existe uma maneira de executar um script no desligamento, depois que o sistema de arquivos for remontado como somente leitura?
Tenho um Raspberry Pi conectado a uma tomada sem fio, que posso controlar por meio de um remetente e um script. Quero desligar esse soquete (desligando o framboesa) no desligamento, depois que o sistema de arquivos for montado como somente leitura.
Eu tentei isso:
[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
O script /test gera as montagens atuais. Quando é executado no desligamento, ele indica leitura/gravação para o sistema de arquivos raiz e não somente leitura conforme o esperado.
Editar:
Conteúdo de /teste:
#!/bin/bash
echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1
Saída da tela no desligamento:
Responder1
Encontrei uma solução confiável: basta colocar o script em /usr/lib/systemd/system-shutdown/.
Veja também:https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
Imediatamente antes de executar o sistema real, halt/poweroff/reboot/kexec systemd-shutdown executará todos os executáveis em /usr/lib/systemd/system-shutdown/ e passará um argumento para eles: "halt", "poweroff", "reboot " ou "kexec", dependendo da ação escolhida. Todos os executáveis neste diretório são executados em paralelo e a execução da ação não continua antes que todos os executáveis sejam concluídos.
Responder2
Em relação ao seu script original, ele geralmente é executado antes de halt.target (observe que você não o solicitou antes de halt.target) - e os sistemas de arquivos nunca são remontados nesse ponto. systemd-shutdown (para o qual os executivos do systemd no final - depois de atingir halt.target), mata coisas (possivelmente junto com seu script não ordenado =) ), executa umount/swapoff/losetup final, remonta o que não poderia ser desmontado, em seguida, executa em paralelo o diretório de desligamento do sistema e tenta pivot_root() em /run/initrams se o desligamento existir lá (e se não existir ou o pivô falhar, prossegue com a parada).