Làm thế nào để hủy bỏ cài đặt apt-get một cách an toàn?


44

Tôi có một apt-get installquá trình dường như được nêm vô vọng ở processing triggers for python-supportbước này.

Xu hướng của tôi là về killnó, nhưng trong quá khứ, chỉ đơn giản là killmột apt-get installquá trình đã khiến tôi đau buồn nhiều. (Các tệp khóa loại IIRC bị bỏ lại, v.v.)

Có cách nào an toàn hơn để ngăn chặn quá trình này?

Câu trả lời:


44

Quá trình giết chết

Nói chung để giết một quá trình, không có cách nào an toàn hơn để giết một quá trình hơn là giết thường xuyên (SIGTERM). Trong trường hợp đó là một quá trình tương tác, nó thường cho phép bạn dừng nó thậm chí an toàn hơn bằng cách gửi tín hiệu SIGINT, thường được gửi bằng cách nhấn Ctrl+ C. Tín hiệu này đang bị giữ lại bởi chính quá trình có thể lắng nghe nó - và thường dừng lại một cách duyên dáng. ( cảm ơn Eliah )

Cơ sở dữ liệu DPKG

Về quản lý gói là một loại trường hợp đặc biệt. Cơ sở dữ liệu DPKG mà các lệnh APT sử dụng dưới nước luôn có thể phát hiện xem một hoạt động chưa kết thúc. Mọi gói đều có trạng thái thực tế được đánh dấu cũng như trạng thái hiện tại , ví dụ như đã giải nén, được cấu hình, v.v. Bằng cách giết giao diện APT, cơ sở dữ liệu sẽ ở trạng thái bị hỏng, nhưng ở trạng thái đã biết . Các tệp khóa sẽ chỉ được phát hành khi tất cả trở lại trạng thái sạch - bạn nên sửa lỗi này cho đến khi nó cho phép các hoạt động mới.

Cách khắc phục chỉ là kích hoạt một quy trình để có được tất cả các gói ở trạng thái được cấu hình. Thực tế mà nói, nếu bạn bị gián đoạn một apt-getthao tác, bạn có thể hoàn thành nó sau bằng cách sử dụng

sudo dpkg --configure -a

Nó biết làm thế nào để phục hồi từ trạng thái bị hỏng thành trạng thái được cấu hình toàn bộ và theo nghĩa đó chỉ cần tiếp tục từ nơi nó bị gián đoạn. Các tệp khóa được để ở đó cho đến khi bạn hoàn thành điều đó và đó là lý do - để ngăn các hoạt động mới với cơ sở dữ liệu DPKG ở trạng thái ô uế.

Về SIGKILL (9)

Gửi một SIGKILL (đại diện thập phân 9) là rất không an toàn. Tín hiệu này không bị bắt bởi quá trình, nhưng toàn bộ quá trình sẽ được dọn sạch bởi hệ điều hành (kernel) cho dù tiến trình có thích hay không. Trạng thái của các tệp trên hệ thống tệp có thể bị bỏ lại ở trạng thái bị hỏng. Không bao giờ gửi các tín hiệu này trừ khi nó không nghe các tín hiệu duyên dáng khác nữa.


2
Khi một ứng dụng cung cấp một cách để chấm dứt nó, điều đó thậm chí còn an toàn hơn SIGTERM. Ví dụ: hầu hết (nếu không phải tất cả) trình soạn thảo văn bản, trình xử lý văn bản, chương trình đồ họa, trình duyệt web và các ứng dụng đồ họa hoặc dựa trên văn bản khác mà người dùng có thể tạo nội dung không bị mất, không tự động lưu nó trước khi bỏ thuốc khi họ nhận được SIGTERM. Ngoài ra, xin lưu ý rằng SIGINT đôi khi có thể an toàn hơn SIGTERM (nhưng thường không nên được gửi trừ khi kết quả tương tự như Ctrl + C được mong muốn rõ ràng).
Eliah Kagan

16

Khi tôi gặp lỗi với apt-get, tôi thực hiện các thao tác sau (dưới dạng root, tức là sudotrước tất cả các lệnh):

  1. Giết quá trình có tên apt-get:

    killall -9 apt-get
  2. Cấu hình lại dpkg:

    dpkg - cấu hình -a
  3. Cập nhật apt-get:

    cập nhật apt-get
  4. Cập nhật các gói, bao gồm cả những gói được cài đặt không đúng cách:

    nâng cấp apt-get

Điều này tôi học được từ đâu đó, nhưng tiếc là tôi không thể nhớ chính xác ở đâu.


6
Vui lòng không bao giờ gửi tín hiệu 9 (SIGKILL) trừ khi bạn có lý do rất chính đáng để làm như vậy. Xem câu trả lời cập nhật của tôi.
gertvdijk

3
sudo dpkg -r <package name>

Trong trường hợp của tôi, tôi đã gặp vấn đề với Java 8 trên Ubuntu 12.04, vì vậy ...

sudo dpkg -r oracle-java8-installer

1

Linux và các hệ thống loại Unix khác rất mạnh từ dòng lệnh nhưng rất không tha thứ khi một quá trình đã bắt đầu. Gửi một quy trình, tín hiệu kill chắc chắn sẽ giết quá trình đang chạy nhưng hãy nhớ rằng bạn đang để cơ sở dữ liệu ở trạng thái không ổn định. Bản ghi cuối cùng có thể không được đóng lại một cách chính xác để bạn có nguy cơ phải sửa chữa cơ sở dữ liệu. Không chỉ với apt mà với bất kỳ ứng dụng.

Luôn cố gắng kết thúc ứng dụng theo cách thông thường và chỉ giết các tiến trình đang chạy ứng dụng.


0

Đây là cách tôi thực hiện, Ctrl+ CNhưng hãy nhớ rằng nó an toàn miễn là apt-get đang trong giai đoạn tải xuống hoặc cập nhật bộ đệm. Khác hơn là tôi không thể nghĩ một cách an toàn hơn. Chỉ cần để nó kết thúc và hoàn tác các thay đổi bằng cách gỡ cài đặt hoặc hạ cấp bằng cách nào đó. Các tập tin tải về có thể được làm sạch bằngsudo apt-get autoclean

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.