So zeigen Sie beim Herunterfahren in Plymouth eine Meldung an, wechseln den Modus und bringen PKCON zum Laufen

So zeigen Sie beim Herunterfahren in Plymouth eine Meldung an, wechseln den Modus und bringen PKCON zum Laufen

Ich versuche, ein Skript zu schreiben, das a) das Systemupdate vor dem Herunterfahren (nicht beim Neustart) durchführt und dem Benutzer in Plymouth den Fortschritt anzeigt.

Bisher habe ich es geschafft, dass das Skript (manchmal?) beim Herunterfahren gestartet wird, aber es startet auch beim Neustart (muss behoben werden).

[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

Das eigentliche Skript ist dieses:

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

Diese Funktionen (oder ich möchte, dass sie) a) den Benutzer darüber informieren, dass sein System aktualisiert wird, b) die Aktualisierung mithilfe von pkcon starten und c) den Plymouth-Offline-Update-Splash anzeigen (den Splash, der angezeigt wird, wenn Offline-Aktualisierungen installiert werden) und den Fortschritt von pkcon abrufen, um ihn dem Benutzer anzuzeigen (deshalb verwenden sie grep und tail -1, um nur die letzte Übereinstimmung abzurufen).

Aus irgendeinem Grund gelingt es mir, das Skript zu starten, aber es werden keine Plymouth-Meldungen angezeigt und pkcon startet nicht oder schlägt fehl, wenn es startet. Dieses Skript hat wahrscheinlich viele Probleme, die ich nicht debuggen konnte, da Plymouth und systemd nicht wirklich hilfreich sind.

Jeder Tipp ist willkommen! Vielen Dank!

BEARBEITEN: Ich habe plymouth-x11 installiert, um mein Skript zu testen. Interessanterweise werden vom Skript gesendete Befehle auch hier beim Ausführen ignoriert (sogar in einer Root-Shell), aber genau diese Befehle, die manuell in die Root-Shell eingegeben werden, funktionieren. Ich habe auch diese Zeile hinzugefügt, um zu prüfen, ob plymouth ausgeführt wird:

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

und es wird zurückgegeben, dass es läuft. Das macht keinen Sinn

EDIT2: Mit plymouth-x11 habe ich herausgefunden, dass plymouth die Meldung anzeigt, wenn man die Funktionen update() und plymouth() entfernt (die Zeilen löscht). Das erneute Hinzufügen der Funktionen unterbricht sie wieder. Außerdem funktionieren sie wieder, wenn man den Befehl plymouth über die Funktionsdeklarationen setzt.

EDIT3: Ich habe die Funktionen entfernt und den Code in eine zusätzliche Datei gepackt. Jetzt funktioniert es wie erwartet (zumindest in meiner Testumgebung). Die Frage ist also: Warum bricht mein Skript ab, wenn ich die Funktionen hinzufüge?

EDIT4: Benennen Sie Ihre Funktionen nicht wie einen Befehl, den Sie aufrufen möchten -_-

EDIT5: Das Skript sollte also nichts mehr tun, wenn ich neu starte, aber trotzdem: plymouth zeigt keine Nachrichten an und das Skript scheint beim Herunterfahren nicht aufgerufen zu werden. Das sind die Probleme, die mir derzeit bekannt sind. Ein Skript zu testen, das nicht aufgerufen wird, ist ziemlich schwierig. Das Skript funktioniert, wenn ich plymouthd manuell mit plymouth-x11 starte.

Ich verwende Ubuntu 21.04

verwandte Informationen