Я пытаюсь написать скрипт, который делает а) обновление системы перед выключением (не при перезагрузке) и показывает прогресс пользователю на Плимуте.
Пока что мне удалось заставить его запускать скрипт (иногда?) при выключении, но он также запускается при перезагрузке (будет исправлено).
[Ед. изм]
Description=Обновление при выключении
До = poweroff.target halt.target shutdown.target
After=network-online.target multi-user.target
[Оказание услуг]
Тип = ваншот
ExecStart=/bin/true
RemainAfterExit=true
ExecStop=/usr/доля/услуги/shutdown_update
TimeoutSec=бесконечность
[Установить]
WantedBy=poweroff.target halt.target shutdown.target
Собственно скрипт такой:
#!/бин/ш
fun_update () {
plymouth display-message --text "Aktualisierungen werden installiert..."
режим изменения Плимута --updates
pkcon update -p -y > /tmp/update_status.txt
обновление=0
Plymouth изменить режим --boot-up
plymouth display-message --text "Aufräumen..."
apt-получить автоочистку
apt-получить автоматическое удаление
Plymouth изменить режим --shutdown
}
fun_plymouth () {
в то время как [ "$ обновление" = 1 ]
делать
plymouth system-update --progress $(cat /tmp/update_status.txt | grep -oP "(?<=Процент: ).*" | хвост -1)
plymouth display-message --text "$(cat /tmp/update_status.txt | grep -oP "(?<=Percentage: ).*" | tail -1)%"
спать 1
сделано
}
если эхо systemctl list-jobs | egrep -q 'reboot.target.*start';
тогда
выход 0
фи
Plymouth изменить режим --boot-up
обновление=0
plymouth display-message --text 'Aktualisierung wird vorbereitet...'
plymouth display-message --text "Es wird nach Aktualisierungen gesucht..."
обновление pkcon
update_list=$(pkcon получает обновления)
эхо $update_list
если ! эхо "$update_list" | grep -q "В настоящее время нет доступных обновлений."; тогда
обновление=1
fun_update & fun_plymouth & ждать
еще
plymouth display-message --text "Keine Aktualisierungen gefunden!"
спать 3
фи
plymouth display-message --text ""
Что делают эти функции (или то, что я хочу, чтобы они делали): а) информируют пользователя о том, что его система будет обновлена, б) запускают обновление с помощью pkcon и в) показывают всплеск автономного обновления plymouth (всплеск, который отображается при установке автономных обновлений) и получить ход выполнения pkcon, чтобы показать его пользователю (поэтому grep и tail -1, чтобы получить только последнее совпадение).
Но по какой-то причине мне удается запустить скрипт, но сообщения plymouth не отображаются, а pkcon не запускается, а когда запускается, происходит сбой.
Вероятно, в этом скрипте много проблем, я не успел отладить, так как plymouth и systemd не очень помогают.
Каждый совет приветствуется!
Большое спасибо!
РЕДАКТИРОВАТЬ: я установил plymouth-x11, чтобы проверить свой скрипт; интересно, что команды, отправленные скриптом, здесь также игнорируются при запуске (даже в корневой оболочке), но именно эти команды, введенные вручную в корневой оболочке, работают. Я также добавил эту строку, чтобы проверить, работает ли plymouth:
plymouth --ping && echo plymouth работает || Эхо Плимут НЕ работает
и он возвращает, что он работает.
Это не имеет смысла
EDIT2: с plymouth-x11 я обнаружил, что удаление (удаление строк) функций update() и plymouth(), plymouth показывает сообщение.Повторное добавление функций снова ломает его.
Кроме того, размещение команды plymouth над объявлениями функций заставляет их снова работать.
EDIT3: я удалил функции и поместил код в дополнительный файл. Теперь он работает так, как ожидалось (по крайней мере, в моей тестовой среде).
Итак, вопрос: почему мой скрипт ломается, когда я добавляю функции?
EDIT4: не называйте свои функции как команду, которую вы хотите вызвать -_-
РЕДАКТИРОВАТЬ 5: Таким образом, при перезагрузке скрипт больше ничего не должен, но все же: plymouth не показывает никаких сообщений, и скрипт, похоже, не вызывается при завершении работы. Это проблемы, о которых я знаю прямо сейчас, тестирование скрипта, который не вызывается, довольно сложно. Скрипт работает, когда я запускаю plymouth вручную с помощью plymouth-x11.
Я использую Ubuntu 21.04