
Estoy intentando escribir un script que realice a) la actualización del sistema antes de apagarlo (no al reiniciar) y muestre el progreso al usuario en Plymouth.
Hasta ahora, bueno, logré que iniciara el script (¿a veces?) al apagar, pero también se inicia al reiniciar (por arreglar).
[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
El guión real es 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 ""
Lo que hacen estas funciones (o lo que quiero que hagan) es a) informar al usuario que su sistema se va a actualizar, b) iniciar la actualización usando pkcon y c) mostrar la presentación de actualización fuera de línea de Plymouth (la presentación que es se muestra cuando se instalan actualizaciones sin conexión) y obtener el progreso de pkcon para mostrárselo al usuario (es por eso que grep y tail -1, para obtener solo la última coincidencia).
Pero por alguna razón, logro iniciar el script, pero no se muestran mensajes de Plymouth y pkcon no se inicia o, cuando lo hace, falla. Probablemente haya muchos problemas en este script, no logré depurarlo, ya que plymouth y systemd no son realmente útiles.
¡Todos los consejos son bienvenidos! ¡Muchas gracias!
EDITAR: instalé plymouth-x11 para probar mi script; Curiosamente, los comandos enviados por el script también se ignoran aquí cuando se ejecutan (incluso en un shell raíz), pero estos comandos exactos ingresados manualmente en el shell raíz funcionan. También agregué esta línea para verificar si Plymouth se está ejecutando:
plymouth --ping && echo plymouth is running || echo plymouth NOT running
y vuelve que está funcionando. Esto no tiene sentido
EDITAR2: Con plymouth-x11 descubrí que al eliminar (eliminar las líneas de) las funciones update() y plymouth(), plymouth muestra el mensaje. Volver a agregar las funciones lo rompe nuevamente. Además, colocar el comando plymouth encima de las declaraciones de funciones hace que vuelvan a funcionar.
EDITAR3: eliminé las funciones y coloqué el código en un archivo adicional. Ahora funciona como se esperaba (al menos en mi entorno de prueba). Entonces la pregunta es: ¿Por qué mi script se rompe cuando agrego las funciones?
EDITAR4: No nombre sus funciones como un comando al que desea llamar -_-
EDITAR 5: Entonces, el script ya no debería funcionar cuando reinicio, pero aún así: Plymouth no muestra ningún mensaje y parece que el script no se llama al apagar. Estos son los problemas que conozco en este momento; probar un script que no se llama es bastante difícil. El script funciona cuando inicio plymouthd manualmente con plymouth-x11.
Estoy ejecutando Ubuntu 21.04