如何让普利茅斯在关机时显示消息、切换模式并使 pkcon 工作

如何让普利茅斯在关机时显示消息、切换模式并使 pkcon 工作

我正在尝试编写一个脚本,使系统在关机前(而不是重启时)进行更新,并向 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 ""

这些函数的作用(或者我希望它们的作用)是 a)通知用户他的系统将要更新,b)使用 pkcon 开始更新,c)显示 plymouth 离线更新启动画面(安装离线更新时显示的启动画面)并获取 pkcon 的进度以显示给用户(这就是为什么 grep 和 tail -1 只获取最后一个匹配项)。

但出于某种原因,我设法启动了脚本,但没有显示任何 plymouth 消息,并且 pkcon 无法启动,或者启动后失败。这个脚本中可能存在很多问题,我没有设法调试,因为 plymouth 和 systemd 真的没什么用。

欢迎提出任何建议!非常感谢!

编辑:我安装了 plymouth-x11 来测试我的脚本;有趣的是,脚本发送的命令在运行时也会被忽略(即使在 root shell 中),但在 root shell 中手动输入的这些命令却有效。我还添加了此行来检查 plymouth 是否正在运行:

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

并返回正在运行。这没有意义

EDIT2:使用 plymouth-x11 我发现删除 update() 和 plymouth() 函数(删除行)后,plymouth 会显示该消息。重新添加函数会再次中断该消息。此外,将 plymouth 命令置于函数声明上方会使它们再次工作。

EDIT3:我删除了这些函数,并将代码放在一个额外的文件中。现在它可以按预期工作(至少在我的测试环境中)。所以问题是:为什么当我添加这些函数时我的脚本会中断?

EDIT4:不要将你的函数命名为你想要调用的命令 -_-

EDIT5:因此,当我重新启动时,脚本应该不再有任何内容,但仍然:plymouth 没有显示任何消息,并且脚本似乎在关机时未被调用。这些是我现在知道的问题,测试未被调用的脚本非常困难。当我使用 plymouth-x11 手动启动 plymouthd 时,脚本可以工作。

我正在运行 Ubuntu 21.04

相关内容