Para lidar com isso, combinei três mecanismos:
- Um script de logoff do Lightdm, que obtém as informações do usuário e as grava em um arquivo temporário, para que possamos saber quem está desligando o computador. Ele também faz a tarefa pesada no caso de não estarmos desligando ou reinicializando.
- Scripts initrd tradicionais para executar tarefas pesadas ao desligar ou reinicializar.
- Mensagens de status do Plymouth para fornecer feedback sobre essas tarefas pesadas ao desligar ou reinicializar.
Então, eu tenho o script de tarefas pesadas em /usr/local/bin/heavy.sh
:
#!/bin/bash
touch /tmpfile
for p in $(seq 0 300) ; do
sleep 1
echo $p >> /tmpfile
if [ ! -z $DISPLAY ] ; then
notify-send "Written $p"
else
plymouth message --text="Written $p" &>/dev/null
fi
done
Essa tarefa pesada tenta gerar informações para o X. Se isso falhar, tente fazer isso em Plymouth.
Em seguida, adicionei esta linha à configuração do Lightdm em /etc/lightdm/lightdm.conf
:
session-cleanup-script=/usr/local/sbin/logout-tasks.sh
O script referenciado escreve o usuário no logout e tenta executar a tarefa pesada:
#!/bin/bash
echo $USER > /run/last-logout-user
/usr/local/bin/heavy.sh
O script initrd, localizado em /etc/init.d/logout-heavy-task-at-shutdown
:
#!/bin/bash
USER_RUN=$(cat /run/last-logout-user)
sudo -u $USER_RUN /usr/local/bin/heavy.sh
Isso inicia a tarefa como o último usuário desconectado ao encerrar e reiniciar, considerando que adicionamos os links correspondentes:
update-rc.d -n logout-heavy-task-at-shutdown start 05 0
update-rc.d -n logout-heavy-task-at-shutdown start 05 6
E é isso. A tarefa pesada pode precisar ser manipulada quando for eliminada por X e, em seguida, iniciada novamente pelo script initrd. Dependendo da tarefa, isso pode não ser um problema.