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