Как заставить plymouth показывать сообщение при выключении, переключить режим и заставить pkcon работать

Как заставить plymouth показывать сообщение при выключении, переключить режим и заставить pkcon работать

Я пытаюсь написать скрипт, который а) обновляет систему перед выключением (не при перезагрузке) и показывает ход процесса пользователю Plymouth.

Пока что мне удалось заставить его запускать скрипт (иногда?) при выключении, но он также запускается при перезагрузке (это нужно исправить).

[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

Настоящий сценарий таков:

#!/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 ""

Что делают эти функции (или что я хочу, чтобы они делали): а) информируют пользователя о том, что его система будет обновлена, б) запускают обновление с помощью pkcon и в) показывают заставку обновления Plymouth Offline (заставку, которая отображается при установке обновлений Offline) и получают ход выполнения pkcon, чтобы показать его пользователю (вот почему grep и tail -1 — чтобы получить только последнее совпадение).

Но по какой-то причине мне удается запустить скрипт, но никаких сообщений plymouth не отображается, и pkcon не запускается или, когда запускается, то дает сбой. Вероятно, в этом скрипте много проблем, я не смог их отладить, так как plymouth и systemd не особо помогают.

Любой совет приветствуется! Большое спасибо!

EDIT: Я установил plymouth-x11, чтобы протестировать свой скрипт; интересно, что команды, отправленные скриптом, здесь также игнорируются при запуске (даже в оболочке root), но эти точные команды, введенные вручную в оболочке root, работают. Я также добавил эту строку, чтобы проверить, запущен ли plymouth:

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

и он возвращается, что он работает. Это не имеет смысла

EDIT2: С plymouth-x11 я обнаружил, что при удалении (удалении строк) функций update() и plymouth() plymouth показывает сообщение. Повторное добавление функций снова его ломает. Кроме того, размещение команды plymouth над объявлениями функций заставляет их снова работать.

EDIT3: Я удалил функции и поместил код в дополнительный файл. Теперь он работает так, как и ожидалось (по крайней мере, в моей тестовой среде). Итак, вопрос: почему мой скрипт ломается, когда я добавляю функции?

EDIT4: Не называйте свои функции как команды, которые вы хотите вызвать -_-

EDIT5: Итак, скрипт больше ничего не должен делать, когда я перезагружаюсь, но все равно: plymouth не показывает никаких сообщений, и скрипт, похоже, не вызывается при выключении. Это проблемы, о которых я знаю прямо сейчас, тестировать скрипт, который не вызывается, довольно сложно. Скрипт работает, когда я запускаю plymouthd вручную с помощью plymouth-x11.

Я использую Ubuntu 21.04.

Связанный контент