apt / unattended-upgrade stalls shutdown


14

เมื่อunattended-upgradesติดตั้งแล้ว 9 ใน 10 การปิดระบบ / การรีบูตจะหยุดขณะที่ "การเริ่มต้นการปิดการอัพเกรดแบบอัตโนมัติ" การหยุดทำงานนี้จะหยุดกระบวนการปิดเครื่องประมาณ 5-10 นาที

หากฉันปิดใช้งานการอัพเกรดแบบไม่ตั้งใจผ่านทาง/etc/apt/apt.conf.d/20auto-upgrades and/or 50unattended-upgradesปัญหาจะเกิดขึ้น

ถ้าฉันยกเลิกบริการก่อนที่จะปิด / รีบูต ( sudo service unattended-upgrades stop) ปัญหายังคงเกิดขึ้น

หากฉันลบแพ็กเกจ ( sudo apt remove unattended-upgrades) ปัญหาจะไม่เกิดขึ้นอีก

สิ่งนี้เกิดขึ้นในเวอร์ชันที่ติดตั้งใหม่Ubuntu Server 16.04.1(ทั้งunattended-upgradesติดตั้งผ่านการติดตั้ง GUI หรือการติดตั้งด้วยตนเองของการอัพเกรดแบบอัตโนมัติ)

ทั้งสองKern.log & syslogไม่แสดงกระบวนการปิดเครื่อง (ฉันเชื่อว่าเนื่องจากระบบไฟล์ได้ถอนการติดตั้งแล้ว)

มีคนอื่นเห็นหรือแก้ไขปัญหานี้หรือไม่? จะบ้าพยายามแก้ไขปัญหา


ไม่สามารถทำซ้ำใน VM ทดสอบ 16.04.1 การปิดเครื่องไม่ได้ล่าช้าที่นี่
user535733

มันเป็นฮาร์ดแวร์ได้หรือไม่ ฉันไม่แน่ใจทั้งหมดว่าเกิดอะไรขึ้นunattended-upgradesในช่วงปิดเครื่อง
garullon245136

ฉันสงสัยว่าทำไม uu ทำงานอยู่ตลอดเวลาที่ปิดเครื่อง: uu ไม่ใช่ daemon; มันเป็นเพียงสคริปต์ที่ทำงานสั้น ๆ ทุกวันและสิ้นสุดลง
user535733

ดูเหมือนว่ากระบวนการปิดระบบพยายามที่จะเรียกใช้ uu ในช่วงที่ระบบไฟล์ทั้งหมดกำลังถูกถอดออกซึ่งดูเหมือนว่าจะไม่ถูกควบคุมโดยลิงก์ /etc/rc6.d/ หรือ /etc/rc0.d/ ที่ควบคุม ฉันได้ลบลิงก์ทั้งหมดและกระบวนการยังคงทำงานในระหว่างการปิดเครื่อง
garullon245136

2
ดูใน /etc/apt/apt/conf.d/50unattended-upgrades สำหรับตัวเลือก 'run uu at shutdown' (ประมาณบรรทัดที่ 25) ตรวจสอบให้แน่ใจว่ามันเป็น 'เท็จ' หรือแสดงความคิดเห็น
user535733

คำตอบ:


14

มองไปรอบ ๆ เพื่อให้เข้าใกล้สาเหตุที่แท้จริง

ปัญหาดูเหมือนว่าสคริปต์จะทำงานเมื่อปิดเครื่อง

ฉันระบุไฟล์ที่เกี่ยวข้องกับ:

find /etc/systemd -name *unattended*

ซึ่งให้สคริปต์ systemd ที่เกี่ยวข้องให้ฉัน:

/etc/systemd/system/shutdown.target.wants/unattended-upgrades.service

ซึ่งจากนั้นบอกฉันว่าสคริปต์ทำงานเมื่อปิดเครื่อง:

/usr/share/unattended-upgrades/unattended-upgrade-shutdown

สำรวจลึกเพื่อค้นหาสาเหตุที่แท้จริง

ภายในสคริปต์นี้มีส่วนในบรรทัด 120 ที่เกี่ยวข้องกับส่วนใน /etc/apt/apt.conf.d/50unattended-upgrades -> Unattended-Upgrade :: InstallOnShutdown

บรรทัดที่ 120 ของ / usr / share / unattended-upgrade / unattended-upgrade-shutdown:

if apt_pkg.config.find_b("Unattended-Upgrade::InstallOnShutdown", False):

ปัญหา: คาดว่าคำหลัก "เท็จ" ในขณะที่เราควรเพิ่ม "false" (การเปรียบเทียบสตริงที่แน่นอน)!

วิธีการแก้

ฉันสามารถแก้ไข / แก้ปัญหาการปิดเครื่องใน 3 วิธี:

วิธีแก้ปัญหา A

  • เขียน "เท็จ" แทน "false" ใน /etc/apt/apt.conf.d/50unattended-upgrades

การตั้งค่านี้จะอัปเกรดอย่างปลอดภัยจนกว่าจะมีการแก้ไขจริงเนื่องจากไฟล์ที่เราเปลี่ยนแปลงที่นี่จะไม่ถูกเขียนทับโดยการอัปเดตการอัปเกรดแบบไม่ต้องใส่ข้อมูล ปัญหา: เมื่อสาเหตุของปัญหาได้รับการแก้ไขสิ่งนี้จะส่งผลให้มีการปิดเครื่องอีกครั้งดังนั้นฉันขอแนะนำให้รวมสิ่งนี้กับ Workaround B

หรือ: วิธีแก้ปัญหา B

  • ลดเวลารอใน /etc/systemd/system/shutdown.target.wants/unattended-upgrades.service จากค่าเริ่มต้นเป็น 15 วินาที:

vim /etc/systemd/system/shutdown.target.wants/unattended-upgrades.service

[บริการ]
พิมพ์ = Oneshot
ExecStart = / usr / share / แบบอัตโนมัติอัพเกรด / ไม่ต้องใส่-upgrade-ปิด
TimeoutStartSec = 15

การตั้งค่านี้ไม่อัปเกรดอย่างปลอดภัยเนื่องจากไฟล์ที่เราเปลี่ยนแปลงที่นี่อาจถูกเขียนทับโดยการอัปเดตแบบไม่ต้องใส่ข้อมูล นอกจากนี้มันอยู่ไกลจากการแก้ไขบางอย่าง แต่มันจะทำให้แน่ใจว่าระบบของคุณจะไม่รอหลายนาทีเมื่อปิดเครื่อง โปรดทราบว่าหลังจากการอัปเกรดแบบไม่ต้องมีการอัพเกรดคุณอาจต้องตั้งค่านี้อีกครั้ง!

หรือ: แก้ไข C (ต้องรายงานต้นน้ำ)

  • แก้ไข / usr / share / unattended-upgrade / unattended-upgrade-shutdown เพื่อคาดหวังว่า "false" แทนที่จะเป็น "False"

patching / usr / share / unattended-upgrade / unattended-upgrade-shutdown:

--- / tmp / unattended-upgrade-shutdown 2017-02-03 14: 53: 03.238103238 +0100
+++ / tmp / ไม่ต้องดูแล - อัพเกรด - ปิดระบบ _ แก้ไข 2017-02-03 14: 53: 17.685589001 +0100
@@ -117,7 +117,7 @@
     # รัน
     p = ไม่มี
     apt_pkg.init_config ()
- ถ้า apt_pkg.config.find_b ("Unattended-Upgrade :: InstallOnShutdown", เท็จ):
+ ถ้า apt_pkg.config.find_b ("Unattended-Upgrade :: InstallOnShutdown", false):
         env = copy.copy (os.environ)
         env ["UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN"] = "1"
         logging.debug ("เริ่มต้นการอัพเกรดแบบอัตโนมัติในโหมดปิดเครื่อง")

ข้อสรุป

tbh เฉพาะอันสุดท้ายคือการแก้ไขที่แท้จริง ตัวเลือกอื่น ๆ ทั้งสองเป็นเพียงการแก้ปัญหาจนกว่าจะมีการแก้ไขจริง

สิ่งนี้จะต้องทำในขั้นต้นและส่งผลต่อทั้ง Debian (ทดสอบบน Debian Stretch) และ Ubuntu (ทดสอบบน Ubuntu 16.04.1) สำหรับการแจกแจงทั้งสองแบบ

ฉันได้เปิดรายงานข้อผิดพลาดที่นี่: https://bugs.launchpad.net/ubuntu/+source/unattended-upgrades/+bug/1661611


2
apt_pkg.config.find_b () ส่งคืนบูลีนไม่ใช่สตริง "find_b (key [, default = False]) → bool ส่งคืนค่าบูลีนที่เก็บไว้ที่คีย์หรือค่าที่กำหนดโดยวัตถุบูลเริ่มต้นหากตัวเลือกที่ร้องขอไม่ได้ตั้งค่า" apt.alioth.debian.org/python-apt-doc/library/ ...... ดังนั้นจึงไม่ใช่ข้อผิดพลาดในการปิดการอัพเกรดแบบอัตโนมัติโดยไม่ตั้งใจเนื่องจากการตรวจสอบ False นั้นถูกต้อง
Brian Murray

ตามที่ทุกคนที่ติดตามลิงก์รายงานบั๊กของ Launchpad ด้านบนจะเห็นว่าปัญหานี้ไม่ได้เกิดจากการเปรียบเทียบสตริงที่ล้มเหลว แต่เกิดจากข้อผิดพลาดการเรียงลำดับsystemdที่ได้รับการแก้ไขแล้ว
sampablokuper

1

ในฐานะที่เป็นวิธีแก้ปัญหาฉันใช้สคริปต์นี้เพื่อแก้ไข:

#!/usr/bin/env bash

sed -i '/if apt_pkg.config.find_b/s/False/false/' /usr/share/unattended-upgrades/unattended-upgrade-shutdown

exit

หวังว่ามันจะอัปสตรีมในไม่ช้า


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.