Jak bezpiecznie przerwać instalację apt-get?

44

Mam apt-get installproces, który wydaje się być beznadziejnie klinowany na tym processing triggers for python-supportetapie.

Mam na killto killochotę , ale w przeszłości zwykły apt-get installproces wywołał u mnie wielki smutek. (Różne pliki blokad IIRC są pozostawione itp.)

Czy istnieje bezpieczniejszy sposób na zatrzymanie tego procesu?

kjo
źródło

Odpowiedzi:

44

Procesy zabijania

Ogólnie mówiąc za zabicie procesu, nie ma bezpieczniejszego sposobu na zabicie procesu niż zwykłe zabijanie (SIGTERM). W przypadku procesu interaktywnego zwykle pozwala on zatrzymać go jeszcze bezpieczniej, wysyłając sygnał SIGINT, zwykle wysyłany przez naciśnięcie Ctrl+ C. Ten sygnał jest uwięziony przez sam proces, który może go słuchać - i zwykle zatrzymuje się z wdziękiem. ( dzięki Eliah )

Baza danych DPKG

Jeśli chodzi o zarządzanie pakietami, jest to szczególny przypadek. Baza danych DPKG używana przez polecenia APT pod wodą zawsze może wykryć, czy operacja się nie zakończyła. Każdy pakiet ma stan aktualny, który jest oznaczony, a także stan aktualny , np. Rozpakowany, skonfigurowany itp. Po zabiciu interfejsu użytkownika APT baza danych będzie w stanie uszkodzonym, ale w stanie znanym . Pliki blokady zostaną zwolnione dopiero, gdy wszystko wróci do stanu czystego - powinieneś to naprawić, dopóki nie pozwoli na nowe operacje.

Sposobem na naprawę jest uruchomienie procesu, aby uzyskać wszystkie pakiety w skonfigurowanym stanie. Praktycznie rzecz biorąc, jeśli przerwałeś apt-getoperację, możesz po prostu dokończyć ją później

sudo dpkg --configure -a

Wie, jak wyjść ze stanu zepsutego do stanu całkowicie skonfigurowanego iw tym sensie po prostu kontynuować od miejsca, w którym został przerwany. Pliki blokady pozostają tam, dopóki tego nie zrobisz, i to z tego powodu - aby zapobiec nowym operacjom z bazą danych DPKG w stanie nieczystym.

Informacje o firmie SIGKILL (9)

Wysłanie SIGKILL (dziesiętna reprezentacja 9) jest bardzo niebezpieczne. Ten sygnał nie jest wychwytywany przez proces, ale cały proces zostanie wyczyszczony przez system operacyjny (jądro), niezależnie od tego, czy proces mu się podoba, czy nie. Stan plików w systemie plików można pozostawić w stanie uszkodzonym. Nigdy nie wysyłaj tych sygnałów, chyba że nie słuchasz już innych bardziej wdzięcznych sygnałów.

gertvdijk
źródło
2
Gdy aplikacja oferuje sposób jej zakończenia, jest to zwykle nawet bezpieczniejsze niż SIGTERM. Na przykład większość (jeśli nie wszystkie) edytorów tekstu, edytorów tekstu, programów graficznych, przeglądarek internetowych i innych aplikacji tekstowych lub graficznych, w których użytkownik może stworzyć treści, których nie należy utracić, nie zapisuj automatycznie przed rezygnacją, gdy otrzymają SIGTERM. Należy również pamiętać, że SIGINT może czasami być bezpieczniejszy niż SIGTERM (ale ogólnie nie powinien być wysyłany, chyba że taki sam wynik jak Ctrl + C jest wyraźnie pożądany).
Eliah Kagan
16

Kiedy napotykam błąd w apt-get, wykonuję następujące czynności (jako root, tj. sudoPrzed wszystkimi poleceniami):

  1. Zabij proces o nazwie apt-get:

    killall -9 apt-get
  2. Ponownie skonfiguruj dpkg:

    dpkg --configure -a
  3. Zaktualizuj apt-get:

    apt-get update
  4. Zaktualizuj pakiety, w tym te nieprawidłowo zainstalowane:

    apt-get upgrade

Dowiedziałem się tego skądś, ale niestety nie pamiętam dokładnie gdzie.

Carnendil
źródło
6
Nigdy nie wysyłaj sygnału 9 (SIGKILL), chyba że masz ku temu dobry powód. Zobacz moją zaktualizowaną odpowiedź.
gertvdijk
3
sudo dpkg -r <package name>

W moim przypadku miałem problemy z Javą 8 na Ubuntu 12.04, więc ...

sudo dpkg -r oracle-java8-installer
Funmungus
źródło
1

Linux i inne systemy uniksowe są bardzo wydajne z linii poleceń, ale bardzo bezlitosne po rozpoczęciu procesu. Wysłanie procesu sygnał zabicia z pewnością zabije uruchomiony proces, ale pamiętaj, że pozostawiasz bazę danych w niestabilnym stanie. Ostatni rekord może nie zostać poprawnie zamknięty, więc istnieje ryzyko naprawy bazy danych. Nie tylko z apt, ale z dowolną aplikacją.

Zawsze staraj się zakończyć aplikację w normalny sposób i zabijaj tylko procesy, które są uruchamiane.

Steve Sauls
źródło
0

Oto jak to robię Ctrl+. CAle pamiętaj, że jest bezpieczny, dopóki apt-get jest w fazie pobierania lub aktualizuje pamięć podręczną. Poza tym nie mogę wymyślić bezpieczniejszego sposobu. Po prostu pozwól mu zakończyć i cofnąć zmiany, odinstalowując lub obniżając w jakiś sposób wersję. Pobrane pliki można wyczyścić za pomocąsudo apt-get autoclean

Stefano Mtangoo
źródło