
Я пытаюсь написать скрипт, который а) обновляет систему перед выключением (не при перезагрузке) и показывает ход процесса пользователю 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.