ฉันกำลังพยายามเขียนสคริปต์ที่ทำให้ a) อัปเดตระบบก่อนปิดเครื่อง (ไม่ใช่ตอนรีบูต) และแสดงความคืบหน้าให้ผู้ใช้ทราบบน plymouth
จนถึงตอนนี้ฉันสามารถทำให้มันเริ่มสคริปต์ (บางครั้ง?) เมื่อปิดเครื่อง แต่มันก็เริ่มด้วยการรีบูต (เพื่อแก้ไข)
[หน่วย]
คำอธิบาย=อัปเดตเมื่อปิดเครื่อง
ก่อน = poweroff.target halt.target shutdown.target
After=network-online.target หลาย user.target
[บริการ]
Type=วันช็อต
ExecStart=/bin/true
RemainAfterExit=จริง
ExecStop=/usr/share/services/shutdown_update
TimeoutSec=อินฟินิตี้
[ติดตั้ง]
WantedBy=poweroff.target halt.target shutdown.target
สคริปต์จริงคืออันนี้:
#!/bin/sh
fun_update() {
พลีมัธ display-message --text "Aktualisierungen werden installiert..."
โหมดเปลี่ยนพลีมัธ -- อัปเดต
อัปเดต pkcon -p -y > /tmp/update_status.txt
อัพเดท=0
พลีมัธเปลี่ยนโหมด --boot-up
plymouth display-message -- ข้อความ "Aufräumen..."
apt-get ทำความสะอาดอัตโนมัติ
apt-รับการลบอัตโนมัติ
พลีมัธเปลี่ยนโหมด -- ปิดเครื่อง
}
fun_plymouth() {
ในขณะที่ [ "$update" = 1 ]
ทำ
การอัปเดตระบบพลีมั ธ -- ความคืบหน้า $(cat /tmp/update_status.txt | grep -oP "(?<=เปอร์เซ็นต์: ).*" | หาง -1)
plymouth display-message --text "$(cat /tmp/update_status.txt | grep -oP "(?<=Percentage: ).*" | tail -1)%"
นอน1
เสร็จแล้ว
}
ถ้า echo systemctl รายการงาน | egrep -q 'reboot.target.*start';
แล้ว
ทางออก 0
ไฟ
พลีมัธเปลี่ยนโหมด --boot-up
อัพเดท=0
plymouth display-message --text 'Aktualisierung wird vorbereitet...'
plymouth display-message --text "Es wird nach Aktualisierungen gesucht..."
pkcon รีเฟรช
update_list=$(pkcon รับ-updates)
สะท้อน $update_list
ถ้า ! echo "$update_list" | grep -q "ไม่มีการอัพเดตใดๆ ในขณะนี้"; แล้ว
อัพเดท=1
fun_update & fun_plymouth & รอสักครู่
อื่น
plymouth display-message --text "Keine Aktualisierungen gefunden!"
นอน 3
ไฟ
พลีมัธแสดงข้อความ --text ""
ฟังก์ชั่นเหล่านี้ทำอะไร (หรือสิ่งที่ฉันต้องการให้ทำ) คือ a) แจ้งผู้ใช้ว่าระบบของเขากำลังจะได้รับการอัปเดต b) เริ่มการอัปเดตโดยใช้ pkcon และ c) แสดง plymouth offline update splash (สแปลชที่เป็น แสดงเมื่อมีการติดตั้งการอัปเดตแบบออฟไลน์) และรับความคืบหน้าของ pkcon เพื่อแสดงให้ผู้ใช้เห็น (นั่นเป็นสาเหตุที่ grep และ tail -1 เพื่อรับการจับคู่ล่าสุดเท่านั้น)
แต่ด้วยเหตุผลบางอย่าง ฉันจัดการเพื่อเริ่มสคริปต์ แต่ไม่มีข้อความ plymouth ปรากฏขึ้นและ pkcon ไม่เริ่มทำงาน หรือเมื่อเกิดขึ้น แสดงว่าล้มเหลว
อาจมีปัญหามากมายในสคริปต์นี้ ฉันไม่สามารถแก้ไขจุดบกพร่องได้ เนื่องจาก plymouth และ systemd ไม่มีประโยชน์จริงๆ
ยินดีรับทุกคำแนะนำ!
ขอบคุณมาก ๆ!
แก้ไข: ฉันติดตั้ง plymouth-x11 เพื่อทดสอบสคริปต์ของฉัน น่าสนใจ คำสั่งที่ส่งโดยสคริปต์จะถูกละเว้นที่นี่เช่นกันเมื่อรัน (แม้ในรูทเชลล์) แต่คำสั่งที่แน่นอนเหล่านี้ป้อนด้วยตนเองในรูทเชลล์จะทำงานได้ ฉันยังเพิ่มบรรทัดนี้เพื่อตรวจสอบว่า plymouth กำลังทำงานอยู่หรือไม่:
พลีมัธ --ping && echo พลีมัธกำลังทำงาน || echo plymouth ไม่ทำงาน
และมันกลับมามันกำลังทำงานอยู่
สิ่งนี้ไม่สมเหตุสมผล
แก้ไข 2: ด้วย plymouth-x11 ฉันพบว่าการลบ (การลบบรรทัดของ) ฟังก์ชัน update() และ plymouth() ทำให้ plymouth แสดงข้อความการเพิ่มฟังก์ชันอีกครั้งจะทำให้มันหยุดทำงานอีกครั้ง
นอกจากนี้ การวางคำสั่ง plymouth ไว้เหนือการประกาศฟังก์ชัน ทำให้คำสั่งทำงานอีกครั้ง
แก้ไข 3: ฉันลบฟังก์ชั่นและวางรหัสในไฟล์พิเศษ ตอนนี้ทำงานได้ตามที่คาดไว้ (อย่างน้อยในสภาพแวดล้อมการทดสอบของฉัน)
คำถามคือ: ทำไมสคริปต์ของฉันถึงหยุดเมื่อฉันเพิ่มฟังก์ชัน
แก้ไข 4: อย่าตั้งชื่อฟังก์ชั่นของคุณเหมือนคำสั่งที่คุณต้องการเรียก -_-
แก้ไข 5: ดังนั้นสคริปต์ไม่ควรทำอะไรอีกต่อไปเมื่อฉันรีบูต แต่ยังคง: plymouth ไม่แสดงข้อความใด ๆ และดูเหมือนว่าสคริปต์จะไม่ถูกเรียกเมื่อปิดเครื่อง นี่คือปัญหาที่ฉันรู้ในตอนนี้ การทดสอบสคริปต์ที่ไม่ได้เรียกใช้นั้นค่อนข้างยาก สคริปต์ทำงานเมื่อฉันเริ่ม plymouthd ด้วยตนเองด้วย plymouth-x11
ฉันใช้ Ubuntu 21.04