Como fazer com que o plymouth mostre a mensagem durante o desligamento, alterne o modo e faça o pkcon funcionar

Como fazer com que o plymouth mostre a mensagem durante o desligamento, alterne o modo e faça o pkcon funcionar

Estou tentando escrever um script que faça a) a atualização do sistema antes de desligar (não na reinicialização) e mostre o progresso para o usuário no Plymouth.

Até agora eu consegui fazer com que o script iniciasse (às vezes?) No desligamento, mas ele também inicia nas reinicializações (a ser corrigido).

[Unit]
Description=Update on Shutdown
Before=poweroff.target halt.target shutdown.target
After=network-online.target multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=true
ExecStop=/usr/share/services/shutdown_update
TimeoutSec=infinity

[Install]
WantedBy=poweroff.target halt.target shutdown.target

O script real é este:

#!/bin/sh

fun_update() {

    plymouth display-message --text "Aktualisierungen werden installiert..."
    plymouth change-mode --updates
    pkcon update -p -y > /tmp/update_status.txt
    update=0
    plymouth change-mode --boot-up
    plymouth display-message --text "Aufräumen..."
    apt-get autoclean
    apt-get autoremove
    plymouth change-mode --shutdown
}

fun_plymouth() {
    while [ "$update" = 1 ]
    do
        plymouth system-update --progress $(cat /tmp/update_status.txt | grep -oP "(?<=Percentage:  ).*" | tail -1)
        plymouth display-message --text "$(cat /tmp/update_status.txt | grep -oP "(?<=Percentage:   ).*" | tail -1)%"
        sleep 1
    done
}
if echo systemctl list-jobs | egrep -q 'reboot.target.*start';
then
exit 0
fi
plymouth change-mode --boot-up
update=0
plymouth display-message --text 'Aktualisierung wird vorbereitet...'
plymouth display-message --text "Es wird nach Aktualisierungen gesucht..."
pkcon refresh
update_list=$(pkcon get-updates)
echo $update_list
if ! echo "$update_list" | grep -q "There are no updates available at this time."; then
update=1
fun_update & fun_plymouth & wait
else
plymouth display-message --text "Keine Aktualisierungen gefunden!"
sleep 3
fi
plymouth display-message --text ""

O que essas funções fazem (ou o que eu quero que elas façam) é a) informar ao usuário que seu sistema será atualizado, b) iniciar a atualização usando pkcon ec) mostrar o splash de atualização offline do plymouth (o splash que é mostrado quando atualizações offline estão sendo instaladas) e obter o progresso do pkcon para mostrá-lo ao usuário (é por isso que grep e tail -1, para obter apenas a última correspondência).

Mas, por algum motivo, consigo iniciar o script, mas nenhuma mensagem do plymouth é mostrada e o pkcon não inicia ou, quando inicia, falha. Provavelmente há muitos problemas neste script, não consegui depurar, pois plymouth e systemd não são realmente úteis.

Todo conselho é bem-vindo! Muito obrigado!

EDIT: instalei o plymouth-x11 para testar meu script; curiosamente, os comandos enviados pelo script também são ignorados aqui quando executados (mesmo em um shell root), mas esses comandos exatos inseridos manualmente no shell root funcionam. Também adicionei esta linha para verificar se o plymouth está em execução:

plymouth --ping && echo plymouth is running || echo plymouth NOT running

e ele retorna que está em execução. Isto não faz sentido

EDIT2: Com plymouth-x11 descobri que removendo (excluindo as linhas) as funções update() e plymouth(), plymouth mostra a mensagem. Adicionar novamente as funções quebra tudo novamente. Além disso, colocar o comando plymouth acima das declarações de função faz com que elas funcionem novamente.

EDIT3: removi as funções e coloquei o código em um arquivo extra. Agora funciona conforme o esperado (pelo menos no meu ambiente de teste). Então a questão é: Por que meu script quebra quando adiciono as funções?

EDIT4: Não nomeie suas funções como um comando que você deseja chamar -_-

EDIT5: Então, o script não deve mais ser usado quando eu reinicio, mas ainda assim: o plymouth não mostra nenhuma mensagem e o script parece não ser chamado no desligamento. Esses são os problemas que conheço agora. Testar um script que não é chamado é muito difícil. O script funciona quando eu inicio o plymouthd manualmente com o plymouth-x11.

Estou executando o Ubuntu 21.04

informação relacionada