ข้อความนี้E: Could not get lock /var/lib/dpkg/lock-frontendหมายความว่ากระบวนการจัดการแพ็กเกจอื่นกำลังล็อกไฟล์ที่ APT ต้องการอยู่ การล็อกนี้จะป้องกันการเปลี่ยนแปลงแพ็กเกจจากการทำงานที่ทับซ้อนกัน โดยทั่วไปจะปรากฏขึ้นเมื่อโปรแกรมอัปเดตซอฟต์แวร์ เทอร์มินัลอื่น หรือการอัปเดตอัตโนมัติกำลังติดตั้งหรือกำหนดค่าแพ็กเกจอยู่แล้ว วิธีแก้ไขที่ปลอดภัยที่สุดคือการระบุการทำงานนั้นและปล่อยให้มันเสร็จสิ้น การลบไฟล์ล็อกไม่ใช่ขั้นตอนแรกที่ควรทำอย่างไร
คำสั่งด้านล่างนี้ใช้ได้กับระบบ Ubuntu ที่ใช้ APT และ dpkg ป้ายกำกับเดสก์ท็อปและเวลาการอัปเดตอัตโนมัติจะแตกต่างกันไปตามรุ่นและการกำหนดค่าของ Ubuntu ดังนั้นให้พิจารณาผลลัพธ์ของกระบวนการบนเครื่องของคุณเป็นหลัก คู่มือ Ubuntu 24.04 LTS ที่ลิงก์ไว้ด้านล่างได้อธิบายคำสั่งเหล่านี้ไว้ หากพฤติกรรมแตกต่างออกไป โปรดดูคู่มือที่ตรงกับรุ่นของคุณ
ข้อผิดพลาดการล็อกบอกอะไรคุณบ้าง และมันไม่ได้บอกอะไรบ้าง
ตรวจสอบแล้ว: dpkg dpkg ติดตั้งและจัดการแพ็กเกจ ในขณะที่ APT เป็นส่วนหน้าของโปรแกรมจัดการแพ็กเกจระดับสูงกว่าlock-frontendเส้นทางนี้ใช้ในการประสานงานการจัดการแพ็กเกจ ดังนั้นข้อผิดพลาดจึงบ่งชี้ถึงความขัดแย้งในการล็อก ณ เวลาที่เรียกใช้คำสั่ง ไม่ใช่ฐานข้อมูลแพ็กเกจที่เสียหายเสมอไปคู่มือ dpkg ของ Ubuntu อธิบายบทบาทและสถานะของแพ็กเกจใน dpkg
ขึ้นอยู่กับระบบของคุณ: ตัวล็อกอาจเป็นโปรแกรมอัปเดตแบบกราฟิก โปรแกรมจัดการแพ็กเกจตัวที่สองaptหรือapt-getตัวสั่งการ โปรแกรมติดตั้งซอฟต์แวร์ หรือโปรแกรมบำรุงรักษาอัตโนมัติ อย่าเดาชื่อกระบวนการจากข้อผิดพลาดเพียงอย่างเดียว ก่อนอื่นให้ปิดหน้าต่างตัวจัดการแพ็กเกจอื่นๆ ที่คุณเปิดไว้ แล้วตรวจสอบกระบวนการที่กำลังทำงานอยู่บนเครื่อง
ข้อความดังกล่าว ไม่ได้พิสูจน์ว่าไฟล์ล็อกนั้นหมดอายุแล้ว Ubuntu ค้าง หรือฐานข้อมูลแพ็กเกจเสียหาย ไฟล์ล็อกอาจยังคงอยู่บนดิสก์หลังจากกระบวนการสิ้นสุดลง การมีอยู่ของไฟล์ล็อกเพียงอย่างเดียวไม่ได้แสดงว่ากระบวนการนั้นยังคงเป็นเจ้าของล็อกอยู่ ตรวจสอบกระบวนการก่อนทำการเปลี่ยนแปลงใดๆ
ขั้นตอนที่ 1: ตรวจสอบว่ามีการใช้งานโปรแกรมจัดการแพ็กเกจอยู่แล้วหรือไม่
มองหาโปรแกรมอัปเดตซอฟต์แวร์, Ubuntu Software หรือโปรแกรมเทอร์มินัลอื่นๆ ที่กำลังติดตั้ง อัปเดต หรือถอนการติดตั้งซอฟต์แวร์อยู่ หากเห็นว่ามีการอัปเดตกำลังดำเนินการอยู่ ให้เปิดโปรแกรมนั้นทิ้งไว้และรอจนกว่าจะเสร็จสมบูรณ์ จากนั้นลองใช้คำสั่งเดิมของคุณอีกครั้ง
โปรแกรมอัปเดตซอฟต์แวร์แสดงว่ากำลังติดตั้งการอัปเดต โปรดรอจนกว่าการติดตั้งจะเสร็จสิ้นก่อนเริ่มงานอัปเดตแพ็กเกจอื่น
หากไม่เห็นการอัปเดตแบบกราฟิก โปรดตรวจสอบรายการกระบวนการ:
ps -eo pid,ppid,stat,etime,cmd | grep -E '[a]pt|[d]pkg|unattended'
มองหาคำสั่งต่างๆ เช่นapt, apt-get, dpkg, หรือ การพบคำ unattended-upgradeสั่งที่ตรงกันเป็นเพียงเบาะแส ไม่ใช่หลักฐานยืนยันว่าเป็นผู้ถือครองล็อก: การค้นหาอาจแสดงคำสั่งที่ไม่เกี่ยวข้องหรือตัวตรวจสอบเองด้วย จดบันทึก PID และคำสั่ง จากนั้นตรวจสอบกระบวนการในขั้นตอนถัดไป
ขั้นตอนที่ 2: ระบุขั้นตอนที่ล็อกอยู่
ใช้fuserเพื่อตรวจสอบว่ากระบวนการใดกำลังเข้าถึงล็อกส่วนหน้าหรือไม่ เรียกใช้ด้วยสิทธิ์ผู้ดูแลระบบเพื่อให้สามารถรายงานกระบวนการที่เป็นของผู้ใช้รายอื่นได้:
sudo fuser -v /var/lib/dpkg/lock-frontend
คุณสามารถตรวจสอบเส้นทางการล็อกของตัวจัดการแพ็กเกจทั่วไปอื่นๆ ได้เช่นกัน:
sudo fuser -v /var/lib/dpkg/lock /var/cache/apt/archives/lock /var/lib/apt/lists/lock
fuserโปรแกรมนี้ จะแสดงรหัสกระบวนการ (PID) ที่ใช้ไฟล์ที่ระบุ โดยโหมดละเอียดจะแสดงรายละเอียดของกระบวนการ หากแสดง PID ให้เปรียบเทียบกับรายการกระบวนการและตรวจสอบด้วยคำสั่ง `git log int` โดยps -fp PIDแทนที่PID`PID` ด้วยหมายเลขที่แสดง โปรแกรมอาจไม่แสดงผลลัพธ์ใดๆ หากไม่มีกระบวนการใดที่สามารถเข้าถึงได้และกำลังใช้งานเส้นทางนั้น การค้นพบนี้มีประโยชน์ แต่ไม่ใช่สาเหตุที่แท้จริงว่าทำไมคำสั่งก่อนหน้านี้จึงล้มเหลว โปรดดูคู่มือ Fuser ของ Ubuntu สำหรับรายละเอียดเกี่ยวกับผลลัพธ์และข้อจำกัดของโปรแกรม
คำสั่งเทอร์มินัลสำหรับตรวจสอบกระบวนการ apt และ dpkg และระบุกระบวนการโดยใช้ frontend lock
ขั้นตอนที่ 3: รอ หรือหยุดเฉพาะงานที่ค้างอยู่ซึ่งได้รับการยืนยันแล้วเท่านั้น
หากกระบวนการกำลังดาวน์โหลดแพ็กเกจ แตกไฟล์ กำหนดค่าแพ็กเกจ หรือแสดงความคืบหน้าในโปรแกรมอัปเดตแบบกราฟิก ให้รอจนกว่าจะเสร็จสิ้น การอัปเดตขนาดใหญ่และดิสก์ที่ทำงานช้าอาจใช้เวลานานกว่าที่คาดไว้ เมื่อการทำงานเสร็จสิ้น ให้ลองใช้apt-getคำสั่งเดิมอีกครั้ง การเริ่มคำสั่ง APT อื่นในขณะที่คำสั่งแรกกำลังทำงานอยู่จะไม่ทำให้คำสั่งแรกเสร็จเร็วขึ้น
ตัวอย่างการแสดงความคืบหน้าในเทอร์มินัลสำหรับการดำเนินการติดตั้งแพ็กเกจด้วยคำสั่ง apt-get ซึ่งยังคงทำงานอยู่ ชื่อแพ็กเกจและผลลัพธ์อาจแตกต่างกันไป
หากการทำงานดูเหมือนค้าง ให้ตรวจสอบว่าเอาต์พุต การใช้งาน CPU หรือดิสก์ หรือเวลาที่ผ่านไปมีการเปลี่ยนแปลงหรือไม่ ไม่มีค่าหมดเวลาใดค่าหนึ่งที่พิสูจน์ได้ว่างานทุกงานในแพ็กเกจค้างอยู่ หากกระบวนการนั้นเป็นคำสั่งเบื้องหน้าของคุณเองอย่างชัดเจนและคุณสามารถขัดจังหวะได้อย่างปลอดภัย ให้ใช้คำCtrl+C สั่งในเทอร์มินัลนั้นและปล่อยให้มันปิดตัวลงอย่างราบรื่น อย่าฆ่ากระบวนการเพียงเพราะมันถือล็อกอยู่
ในกรณีสุดท้าย หากคุณตรวจสอบแล้วว่ากระบวนการนั้นไม่ตอบสนองจริง ๆ ระบุ PID ที่แน่นอนได้แล้ว และเข้าใจว่าการขัดจังหวะการกำหนดค่าแพ็กเกจอาจทำให้แพ็กเกจบางส่วนยังไม่เสร็จสมบูรณ์ ให้ส่งสัญญาณยุติการทำงานตามปกติ:
sudo kill -TERM PID
แทนที่PIDด้วยรหัสกระบวนการที่ได้รับการยืนยันแล้ว หลีกเลี่ยง การใช้คำสั่ง `docker run` kill -9, killall dpkg`docker run` หรือ ` fuser -kdocker run` เป็นการแก้ไขทั่วไป การยุติกระบวนการโดยใช้กำลังอาจขัดจังหวะสคริปต์ของแพ็กเกจหรือทำให้ต้องกู้คืนงาน หากงานนั้นเป็นบริการอัตโนมัติแทนที่จะเป็นงานที่คุณเริ่มต้น ให้ตรวจสอบสถานะหรือรอแทนที่จะยุติกระบวนการที่ไม่คุ้นเคย
ขั้นตอนที่ 4: ซ่อมแซมการกำหนดค่าแพ็กเกจเฉพาะในกรณีที่งานก่อนหน้านี้ถูกขัดจังหวะ
หากไม่มีกระบวนการ APT หรือ dpkg เหลืออยู่ และการติดตั้งหรืออัปเกรดครั้งก่อนถูกขัดจังหวะ ให้ขอให้ dpkg ดำเนินการกำหนดค่าแพ็กเกจที่แตกไฟล์แล้วให้เสร็จสิ้น จากนั้นตรวจสอบสถานะแพ็กเกจของ APT:
sudo dpkg --configure -a
sudo apt-get check
คำสั่งเทอร์มินัลสำหรับดำเนินการกำหนดค่า dpkg ที่ค้างอยู่ให้เสร็จสมบูรณ์ และตรวจสอบฐานข้อมูลแพ็กเกจหลังจากที่การทำงานถูกขัดจังหวะ
อ่านข้อความแจ้งเตือนและข้อผิดพลาดต่างๆ คำสั่งแรกสามารถเรียกใช้สคริปต์การกำหนดค่าแพ็กเกจได้ ซึ่งอาจใช้เวลานานหรืออาจมีคำถามเพิ่มเติมapt-get checkตรวจสอบการพึ่งพาที่เสียหาย หากพบปัญหาเกี่ยวกับการพึ่งพา โปรดตรวจสอบการเปลี่ยนแปลงที่เสนอ ก่อนใช้งานsudo apt-get -f installตัวเลือกนี้จะพยายามซ่อมแซมการพึ่งพา และอาจติดตั้งหรือลบแพ็กเกจเพื่อดำเนินการดังกล่าว อย่าอนุมัติการลบที่คุณไม่เข้าใจคู่มือ apt-get ของ Ubuntu อธิบาย รายละเอียด checkเกี่ยวกับเรื่อง--fix-brokenนี้
ความเข้าใจผิดทั่วไปเกี่ยวกับข้อผิดพลาดในการล็อก
“ไฟล์ล็อกอยู่ตรงนี้ ดังนั้นฉันควรลบมัน” ไม่ใช่ การมีไฟล์อยู่เฉยๆ ไม่ได้บอกว่ากระบวนการใดกำลังล็อกไฟล์นั้นอยู่ การลบไฟล์ในขณะที่กระบวนการยังทำงานอยู่ไม่ได้หยุดกระบวนการนั้น และอาจทำให้คำสั่งแพ็กเกจอื่นเริ่มทำงานกับฐานข้อมูลแพ็กเกจเดียวกันได้ ตรวจสอบด้วยคำสั่ง `ls` fuserและรายการกระบวนการแทน
“ไม่พบ PID ดังนั้นฐานข้อมูลจึงเสียหาย” ไม่จำเป็นเสมอไป ผู้ใช้งานอาจออกจากระบบระหว่างการตรวจสอบ การล็อกก่อนหน้านี้อาจถูกปล่อย หรือข้อผิดพลาดอาจเกี่ยวข้องกับเส้นทางการล็อกอื่น ลองใหม่อีกครั้งหลังจากยืนยันว่าไม่มีงานแพ็กเกจเหลืออยู่แล้ว ซ่อมแซม dpkg เฉพาะในกรณีที่การดำเนินการถูกขัดจังหวะหรือข้อผิดพลาดของแพ็กเกจบ่งชี้ว่าการกำหนดค่าไม่สมบูรณ์
“ข้อผิดพลาดการล็อกทุกครั้งจำเป็นต้องdpkg --configure -a...” คำสั่งนี้ใช้จัดการกับงานการกำหนดค่าที่ค้างอยู่ ไม่ได้แก้ปัญหาการล็อกที่ยังคงถูกถือครองโดยกระบวนการที่กำลังทำงานอยู่ รอหรือแก้ปัญหาการล็อกของกระบวนการที่กำลังทำงานอยู่ให้เรียบร้อยก่อน จากนั้นจึงใช้คำสั่งซ่อมแซมเมื่อจำเป็นเท่านั้น
“การล็อกจะถูกปลดล็อกโดยอัตโนมัติหลังจากผ่านไปจำนวนนาทีที่กำหนด” กำหนดการอัปเดตอัตโนมัติและระยะเวลาของงานขึ้นอยู่กับเวอร์ชัน การตั้งค่า เครือข่าย และเครื่องคอมพิวเตอร์ ควรตรวจสอบกระบวนการและสถานะความคืบหน้าจริงแทนที่จะพึ่งพาตัวจับเวลา
วิธีตรวจสอบว่าการแก้ไขได้ผลหรือไม่
ลองใช้คำสั่งเดิมอีกครั้งหลังจากตัวล็อกออกจากระบบ การทำงานที่สำเร็จควรจะผ่านข้อความล็อกและดำเนินการติดตั้งแพ็กเกจตามที่ร้องขอ หากdpkg --configure -aเสร็จสิ้นและapt-get checkไม่รายงานปัญหาการพึ่งพาใดๆ แสดงว่าการกำหนดค่าแพ็กเกจและการตรวจสอบการพึ่งพาอยู่ในสถานะที่ดีขึ้น แต่นั่นไม่ได้หมายความว่าปัญหาที่เกี่ยวข้องกับที่เก็บข้อมูลหรือเครือข่ายที่ไม่เกี่ยวข้องทั้งหมดจะได้รับการแก้ไขแล้ว
หากเกิดข้อผิดพลาดเกี่ยวกับการล็อกขึ้นทันที ให้บันทึกเส้นทางการล็อกที่แน่นอน ผลลัพธ์ของsudo fuser -vคำสั่งสำหรับเส้นทางนั้น คำสั่งกระบวนการที่ตรงกัน และ PID รวมถึงว่างานยังคงดำเนินต่อไปหรือไม่ รายละเอียดเหล่านี้จะช่วยแยกแยะการอัปเดตที่แข่งขันกันตามปกติออกจากกระบวนการที่ต้องการการแก้ไขปัญหาเพิ่มเติม อย่าลบไฟล์ออกจาก/var/lib/dpkgหรือลบไฟล์ล็อกเพื่อใช้แทนการระบุตัวกระบวนการ
เอกสารอ้างอิงอย่างเป็นทางการ