如何讓普利茅斯在關機、切換模式時顯示訊息並使 pkcon 運作

如何讓普利茅斯在關機、切換模式時顯示訊息並使 pkcon 運作

我正在嘗試編寫一個腳本,該腳本使a)在關閉之前(而不是重新啟動時)更新系統並向普利茅斯的用戶顯示進度。

到目前為止,我設法讓它在關機時啟動腳本(有時?),但它也會在重新啟動時啟動(待修復)。

[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) 顯示普利茅斯離線更新啟動畫面(啟動畫面是安裝離線更新時顯示)並取得pkcon 的進度以將其顯示給使用者(這就是grep 和tail -1 的原因,僅取得最後一個符合項)。

但由於某種原因,我設法啟動腳本,但沒有顯示普利茅斯訊息,並且 pkcon 沒有啟動,或者啟動時失敗。這個腳本可能有很多問題,我無法調試,因為 plymouth 和 systemd 並沒有真正的幫助。

歡迎提出任何建議!非常感謝!

編輯:我安裝了 plymouth-x11 來測試我的腳本;有趣的是,在執行時間(即使在根 shell 中),腳本發送的命令也會被忽略,但這些命令在根 shell 中手動輸入是有效的。我還添加了這一行來檢查普利茅斯是否正在運行:

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

它返回它正在運行。這根本不符合邏輯

編輯2:使用 plymouth-x11 我發現刪除(刪除行) update() 和 plymouth() 函數,plymouth 顯示訊息。重新添加功能又會破壞它。另外,將 plymouth 指令放在函數宣告上方,可以讓它們再次運作。

EDIT3:我刪除了這些函數並將程式碼放在一個額外的檔案中。現在它按預期工作(至少在我的測試環境中)。所以問題是:為什麼當我新增函數時我的腳本會中斷?

EDIT4:不要將您的函數命名為您要呼叫的命令 -_-

EDIT5:所以,當我重新啟動時,腳本應該不再有任何內容,但仍然:普利茅斯不顯示任何訊息,而且腳本似乎在關閉時不會被呼叫。這些是我現在知道的問題,測試未呼叫的腳本非常困難。當我使用 plymouth-x11 手動啟動 plymouthd 時,該腳本有效。

我運行的是 Ubuntu 21.04

相關內容