วิธียกเลิกการติดตั้ง apt-get อย่างปลอดภัย


44

ฉันมีapt-get installขั้นตอนที่ดูเหมือนว่าจะหมดหวังในprocessing triggers for python-supportขั้นตอน

ความโน้มเอียงของฉันคือkillมัน แต่ในอดีตที่ผ่านมาkillการapt-get installทำกระบวนการทำให้ฉันเศร้าใจมาก (IIRC ไฟล์ล็อคสารพันถูกทิ้ง ฯลฯ )

มีวิธีที่ปลอดภัยกว่าในการหยุดกระบวนการนี้หรือไม่?

คำตอบ:


44

กระบวนการฆ่า

โดยทั่วไปการพูดเพื่อฆ่ากระบวนการไม่มีวิธีที่ปลอดภัยกว่าในการฆ่ากระบวนการมากกว่าการฆ่าปกติ (SIGTERM) ในกรณีก็เป็นขั้นตอนการโต้ตอบก็มักจะช่วยให้คุณสามารถที่จะหยุดมันปลอดภัยมากยิ่งขึ้นโดยการส่งสัญญาณ SIGINT มักจะส่งโดยการกด+Ctrl Cสัญญาณนี้กำลังถูกดักจับโดยกระบวนการเองสามารถฟังได้ - และมักจะหยุดอย่างสง่างาม ( ขอบคุณ Eliah )

ฐานข้อมูล DPKG

เกี่ยวกับการจัดการบรรจุภัณฑ์เป็นกรณีพิเศษ ฐานข้อมูล DPKG ที่คำสั่ง APT ใช้อยู่ใต้น้ำสามารถตรวจจับได้เสมอว่าการดำเนินการยังไม่เสร็จสิ้น ทุกแพ็กเกจมีสถานะจริงซึ่งถูกทำเครื่องหมายในเช่นเดียวกับสถานะปัจจุบันเช่นแยกบรรจุกำหนดค่า ฯลฯ โดยการฆ่าส่วนหน้า APT ฐานข้อมูลจะแตก แต่อยู่ในสถานะที่รู้จัก ไฟล์ล็อคจะได้รับการปล่อยตัวก็ต่อเมื่ออยู่ในสถานะที่สะอาดแล้ว - คุณควรได้รับการแก้ไขนี้จนกว่าจะอนุญาตการดำเนินการใหม่

วิธีการแก้ไขเป็นเพียงการเริ่มกระบวนการเพื่อรับแพ็คเกจทั้งหมดในสถานะที่กำหนดไว้ พูดจริงถ้าคุณขัดจังหวะการapt-getดำเนินการคุณสามารถทำได้ในภายหลังโดยใช้

sudo dpkg --configure -a

มันรู้วิธีการกู้คืนจากสถานะที่ใช้งานไม่ได้ไปยังสถานะที่กำหนดค่าไว้ทั้งหมดและในความหมายนั้นดำเนินการต่อจากที่ถูกขัดจังหวะ ล็อกไฟล์จะอยู่ที่นั่นจนกว่าคุณจะเสร็จสิ้นและนั่นคือเหตุผล - เพื่อป้องกันการดำเนินการใหม่ด้วยฐานข้อมูล DPKG ในสถานะที่ไม่สะอาด

เกี่ยวกับ SIGKILL (9)

การส่ง SIGKILL (การแทนทศนิยม 9) นั้นไม่ปลอดภัยมาก สัญญาณนี้ไม่ถูกตรวจจับโดยกระบวนการ แต่กระบวนการทั้งหมดจะถูกล้างข้อมูลโดยระบบปฏิบัติการ (เคอร์เนล) ไม่ว่ากระบวนการจะชอบหรือไม่ก็ตาม สถานะของไฟล์ในระบบไฟล์สามารถทิ้งไว้ในสถานะที่เสียหายได้ อย่าส่งสัญญาณเหล่านี้หากไม่ได้ฟังสัญญาณที่สง่างามอื่น ๆ อีกต่อไป


2
เมื่อแอปพลิเคชันเสนอวิธีการยกเลิกแอปนั้นมักจะปลอดภัยกว่า SIGTERM ตัวอย่างเช่นตัวแก้ไขข้อความส่วนใหญ่ (ถ้าไม่ทั้งหมด) โปรแกรมประมวลผลคำโปรแกรมกราฟิกเว็บเบราว์เซอร์และแอพที่ใช้ข้อความหรือกราฟิกอื่น ๆ ที่ผู้ใช้มีแนวโน้มที่จะสร้างเนื้อหาที่ไม่ควรสูญหายอย่าบันทึกอัตโนมัติ ก่อนเลิกเมื่อพวกเขาได้รับ SIGTERM นอกจากนี้โปรดทราบว่าบางครั้ง SIGINT อาจปลอดภัยกว่า SIGTERM (แต่โดยทั่วไปไม่ควรส่งเว้นแต่ว่าผลลัพธ์เดียวกันกับ Ctrl + C เป็นที่ต้องการอย่างชัดเจน)
Eliah Kagan

16

เมื่อฉันพบความล้มเหลวกับ apt-get ฉันจะทำสิ่งต่อไปนี้ (ในฐานะ root เช่นsudoก่อนคำสั่งทั้งหมด):

  1. ฆ่ากระบวนการที่ชื่อ apt-get:

    killall -9 apt-get
  2. กำหนดค่า dpkg ใหม่:

    dpkg - กำหนดค่า -a
  3. อัปเดต apt-get:

    apt-get update
  4. แพ็คเกจการอัพเดทรวมถึงแพ็คเกจที่ติดตั้งอย่างไม่เหมาะสม:

    apt-get upgrade

สิ่งนี้ฉันเรียนรู้จากที่อื่น แต่น่าเสียดายที่ฉันจำไม่ได้ว่าอยู่ตรงไหน


6
โปรดอย่าส่งสัญญาณ 9 (SIGKILL) เว้นแต่คุณจะมีเหตุผลที่ดีในการทำเช่นนั้น ดูคำตอบที่อัปเดตของฉัน
gertvdijk

3
sudo dpkg -r <package name>

ในกรณีของฉันฉันมีปัญหากับ Java 8 บน Ubuntu 12.04 ดังนั้น ...

sudo dpkg -r oracle-java8-installer

1

Linux และระบบ Unix อื่น ๆ นั้นมีประสิทธิภาพมากจากบรรทัดคำสั่ง แต่ก็ไม่สามารถให้อภัยได้มากเมื่อกระบวนการเริ่มต้นขึ้น การส่งโปรเซสสัญญาณ kill จะฆ่าโพรเซสที่กำลังทำงานอยู่ แต่โปรดจำไว้ว่าคุณกำลังออกจากฐานข้อมูลในสภาวะที่ไม่เสถียร ระเบียนสุดท้ายอาจไม่ถูกปิดอย่างถูกต้องดังนั้นคุณมีความเสี่ยงที่จะต้องซ่อมแซมฐานข้อมูล ไม่เพียงแค่ฉลาด แต่กับแอปพลิเคชันใด ๆ

พยายามจบแอปพลิเคชั่นด้วยวิธีปกติและฆ่าเฉพาะกระบวนการที่แอพพลิเคชั่นวิ่งหนี


0

นี่คือวิธีที่ฉันทำCtrl+ Cแต่โปรดทราบว่ามันปลอดภัยตราบเท่าที่ apt-get อยู่ในขั้นตอนการดาวน์โหลดหรืออัปเดตแคช นอกจากนั้นฉันไม่สามารถคิดวิธีที่ปลอดภัยกว่า เพียงแค่ปล่อยให้มันเสร็จและยกเลิกการเปลี่ยนแปลงโดยการถอนการติดตั้งหรือลดระดับอย่างใด ไฟล์ที่ดาวน์โหลดสามารถล้างได้ด้วยsudo apt-get autoclean

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