Încerc să scriu un script care face a) actualizarea sistemului înainte de oprire (nu la repornire) și arată progresul utilizatorului de pe plymouth.
Până acum, ei bine, am reușit să-l fac să pornească scriptul (uneori?) la închidere, dar începe și la reporniri (de remediat).
[Unitate]
Descriere=Actualizare la închidere
Înainte=poweroff.target stop.target shutdown.target
După=network-online.target multi-user.target
[Serviciu]
Type=onehot
ExecStart=/bin/true
RemainAfterExit=true
ExecStop=/usr/share/services/shutdown_update
TimeoutSec=infinit
[Instalare]
WantedBy=poweroff.target stop.target shutdown.target
Scriptul real este acesta:
#!/bin/sh
fun_update() {
Plymouth display-message --text „Aktualisierungen werden installliert...”
plymouth change-mode --actualizări
pkcon update -p -y > /tmp/update_status.txt
actualizare=0
plymouth change-mode --boot-up
Plymouth display-message --text „Aufräumen...”
apt-get autoclean
apt-get autoremove
plymouth change-mode --oprire
}
fun_plymouth() {
în timp ce [ "$actualizare" = 1 ]
do
plymouth system-update --progress $(cat /tmp/update_status.txt | grep -oP "(?<=Procent: ).*" | coada -1)
mesaj de afișare plymouth --text "$(cat /tmp/update_status.txt | grep -oP "(?<=Procent: ).*" | coada -1)%"
somn 1
Terminat
}
if echo systemctl list-jobs | egrep -q 'reboot.target.*start';
atunci
iesirea 0
fi
plymouth change-mode --boot-up
actualizare=0
Plymouth display-message --text „Aktualisierung wird vorbereitet...”
Plymouth display-message --text „Es wird nach Aktualisierungen gesucht...”
pkcon reîmprospătare
update_list=$(pkcon get-updates)
echo $update_list
dacă ! echo „$update_list” | grep -q „Nu există actualizări disponibile în acest moment.”; atunci
actualizare=1
fun_update și fun_plymouth și așteptați
altfel
mesaj de afișare plymouth --text „Keine Aktualisierungen gefunden!”
somn 3
fi
Plymouth display-message --text „”
Ceea ce fac aceste funcții (sau ceea ce vreau să facă) este să a) să informeze utilizatorul că sistemul lui va fi actualizat, b) să pornească actualizarea folosind pkcon și c) să arate splash-ul de actualizare offline plymouth (splasul care este afișat când sunt instalate actualizări offline) și obțineți progresul pkcon pentru a-l arăta utilizatorului (de aceea grep și tail -1, pentru a obține doar ultima potrivire).
Dar dintr-un motiv oarecare, reușesc să pornesc scriptul, dar nu sunt afișate mesaje plymouth și pkcon nu pornește sau când se întâmplă, eșuează.
Probabil că există o mulțime de probleme în acest script, nu am reușit să depanez, deoarece plymouth și systemd nu sunt cu adevărat de ajutor.
Orice sfat este binevenit!
Mulțumesc foarte mult!
EDIT: am instalat plymouth-x11 pentru a-mi testa scriptul; interesant, comenzile trimise de script sunt ignorate și aici atunci când sunt rulate (chiar și într-un shell rădăcină), dar aceste comenzi exacte introduse manual în shell rădăcină funcționează. Am adăugat și această linie pentru a verifica dacă plymouth rulează:
plymouth --ping && echo plymouth rulează || echo plymouth NU rulează
și se întoarce că rulează.
Asta nu are niciun sens
EDIT2: Cu plymouth-x11 am aflat că eliminând (ștergând liniile) funcția update() și plymouth(), plymouth arată mesajul.Adăugarea din nou a funcțiilor o întrerupe din nou.
De asemenea, plasând comanda plymouth deasupra declarațiilor de funcție, le face să funcționeze din nou.
EDIT3: Am eliminat funcțiile și am plasat codul într-un fișier suplimentar. Acum funcționează conform așteptărilor (cel puțin în mediul meu de testare).
Deci întrebarea este: de ce se întrerupe scriptul când adaug funcțiile?
EDIT4: Nu vă denumiți funcțiile ca pe o comandă pe care doriți să o apelați -_-
EDIT5: Deci, scriptul nu ar trebui să mai facă nimic când repornesc, dar totuși: plymouth nu afișează niciun mesaj și scriptul pare să nu fie apelat la închidere. Acestea sunt problemele pe care le cunosc acum, testarea unui script care nu se numește este destul de dificilă. Scriptul funcționează când pornesc manual plymouthd cu plymouth-x11.
Rulez Ubuntu 21.04