Jak usunąć / zainstalować pakiet, który nie jest w pełni zainstalowany?

62

Któregoś dnia poszedłem zainstalować bsnes i bez względu na przyczynę instalacja nie powiodła się. Nie mogę teraz aktualizować, instalować nowych pakietów ani w zasadzie wykonywać żadnych poleceń apt-get, ponieważ wszystkie one próbują przetworzyć ten uszkodzony pakiet i kończą się niepowodzeniem. Próba zainstalowania nowego pakietu również skazuje go na ten sam los. Występuje błąd:

Setting up google-chrome-stable (33.0.1750.152-1) ...
/var/lib/dpkg/info/google-chrome-stable.postinst: 124: /var/lib/dpkg/info/google-chrome-stable.postinst: update-alternatives: not found
dpkg: error processing google-chrome-stable (--configure):
 subprocess installed post-installation script returned error exit status 127
Setting up bsnes (0.088-7) ...
/var/lib/dpkg/info/bsnes.postinst: 5: /var/lib/dpkg/info/bsnes.postinst: update-alternatives: not found
dpkg: error processing bsnes (--configure):
 subprocess installed post-installation script returned error exit status 127
Errors were encountered while processing:
 google-chrome-stable
 bsnes
E: Sub-process /usr/bin/dpkg returned an error code (1)

Szukałem w Google i tutaj w Ask Ubuntu, ale nie znalazłem działającego rozwiązania. Często sugerowaną poprawką jest uruchomienie następujących czynności:

sudo apt-get clean && sudo apt-get autoremove
sudo apt-get -f install
sudo dpkg --configure -a

To jednak nie działa. Wszystkie polecenia apt-get kończą się tym samym błędem co powyżej, a polecenie dpkg po prostu nie pomaga. Inną rzeczą, którą często sugerują, aby wyczyścić go za pomocą Synaptic lub wiersza poleceń, co również kończy się niepowodzeniem.

Dzięki za pomoc

Bijak
źródło

Odpowiedzi:

60

Zaawansowanym użytkownikom korzystaj na własne ryzyko.

Zgodnie z następującym komunikatem o błędzie:

subprocess installed post-installation script returned error exit status 127

Możesz edytować /var/lib/dpkg/info/[package_name].postinsti komentować wszystko (lub jeszcze lepiej, spróbuj to zrozumieć i zidentyfikować problem), a następnie spróbuj apt-getponownie.

Należy zauważyć, że chociaż w tym konkretnym pytaniu wiadomość dotyczy „po instalacji”, może zamiast tego wspomnieć np. „Przed usunięciem” lub „po usunięciu” (w których przypadkach rozszerzenie pliku do edycji byłoby .prermlub .postrm) .

Skippy le Grand Gourou
źródło
2
W rzeczywistości jest to najlepsza metoda. Ponowna instalacja dpkgnie zawsze pomaga.
Danatela,
2
Dzięki stosy. Musiałem to naprawić, /var/lib/dpkg/info/[package_name].prermale twój post dał mi właściwy kierunek. Zdecydowanie dla zaawansowanych użytkowników jest to jednak ryzykowne !
sмurf
Najlepsza odpowiedź. Dzięki! Korekta .prermi .postrmpliki rozwiązują problem.
utrwalacz
42

Oprócz tych, które już opublikowałeś, istnieje kilka innych poleceń, które mogą być pomocne.

  • Autoclean usuwa lokalne repozytorium pobranych plików pakietów.

    sudo apt-get autoclean
    
  • Wymuś instalację / usunięcie pakietów. ☠ Używaj ostrożnie

    sudo apt-get --force-yes install <pkgname>
    

    i

    sudo apt-get --force-yes remove <pkgname>
    

Jak zawsze możesz używać dpkgdo instalowania, usuwania i czyszczenia pakietów.

  • zainstalować

    sudo dpkg -i <pkgname>
    
  • Usunąć

    sudo dpkg -r <pkgname>
    
  • Oczyścić

    sudo dpkg -P <pkgname>
    
zarejestrowany użytkownik
źródło
Zarówno komendy dpkg, jak i apt-get --force-yes zwracają ten sam błąd, co przedtem. Autoclean nie zwraca błędu, ale wydaje się również, że nie robi nic z dwoma uszkodzonymi pakietami.
Bijak
@Bijak Musiałeś pewnie próbował oczyszczenie bsnes.Have ty?
Zarejestrowany użytkownik
Tak, z dpkg -P, apt-get purge i Synaptic
Bijak
Opublikuj wynikdpkg -l |grep bsnes
Zarejestrowany użytkownik
rF bsnes 0,088-7 amd64 Dokładny emulator SNES / SuperFamicom
Bijak
27

Więc po kolejnym googlowaniu i naprawdę uważnym przeczytaniu komunikatów o błędach wydaje się, że dpkgtrzeba go ponownie zainstalować.

sudo apt-get install --reinstall dpkg

To, co wskazało, że to był problem (jeśli ktoś to przeszuka i zobaczy), update-alternatives: not foundto komunikat o błędzie. Gdy tylko dpkg został ponownie zainstalowany, pozostałe pakiety kontynuowały instalację normalnie automatycznie.

Bijak
źródło
3
Dlaczego jedyna poprawna (i zaakceptowana) odpowiedź znajduje się tak daleko na liście z mniej niż ⅓ głosów na górze odpowiedzi? +1
David Foerster
po pierwsze: ponieważ nie działa z pakietami, których nie można już pobrać „Ponowna instalacja linux-image-extra-4.4.0-65-generic nie jest możliwa, nie można go pobrać”.
Joe
3
Jest to prawdopodobnie najmniej prawdopodobne rozwiązanie dla każdego, kto tu przyjdzie, na podstawie tytułu pytania. Ale istnieje wiele powodów, dla których ten problem może się skończyć, więc będzie wiele proponowanych rozwiązań „to działa dla mnie”.
Michael
To nie działa.
NelsonGon
15

Możesz usunąć plik pakietu w tej /var/lib/dpkg/info/ścieżce i zaktualizować źródło.

sudo rm /var/lib/dpkg/info/[package_name].*
sudo dpkg --configure -a
sudo apt-get update

Następnie zainstaluj ponownie pakiet sudo apt-get install [package_name]

Dok

Hamed
źródło
4
Właściwie to lepiej wykorzystałeś sudo rm /var/lib/dpkg/info/[pakege_name].*. W przeciwnym razie usuniesz również pakiety, które zaczynają się od tej samej nazwy. Tak czy inaczej, dzięki za to było to jedyne rozwiązanie, które dla mnie
zadziałało
13

Jeśli wszystko inne zawiedzie. Po raz pierwszy zmieniłem katalog na:

cd /var/lib/dpkg/info

następnie usunąłem wszystko za pomocą .postinst:

sudo rm *.postinst

następnie zaktualizuj repozytorium

sudo apt-get update

potem wszystko wróciło do normy, kiedy to zrobiłem:

sudo apt-get --force-yes install openjdk-7-jre-headless
Mike B.
źródło
6
Spowoduje to usunięcie wszystkich skryptów poinstalacyjnych, nie tylko tych, których dotyczy problem. Moim zdaniem trochę zbyt nadgorliwy. -1
David Foerster
Jeśli łatwo jest zidentyfikować i usunąć tylko określony skrypt poinstalacyjny powodujący problem, może to być bardzo wygodny sposób na usunięcie uszkodzonego pakietu.
Ian Mackinnon
po koszmarze z problemami z jądrem zmieniającym nazwę .postinst tylko dotkniętego jądra naprawiono problem
Andy
5

Jeśli wszystko inne zawiedzie, możesz ręcznie usunąć pakiet dpkg. Bieganie sudo dpkg -P bsnespowinno się oczyścić bsnes.

saiarcot895
źródło
2
dpkg: error processing package libcuda1-340 (--purge): package is in a very bad inconsistent state; you should reinstall it before attempting a removal
endolith
2

W moim przypadku apt-get install -fdziałało. Instalowałem mysql-workbench-community

Wcześniej próbowałem apt autoclean

Widziałem ten błąd dpkg z powodu niektórych brakujących zależności, które można poprawić, instalując w trybie wymuszonym (instalowanie zależności)

Vikas Avnish
źródło
0
sudo apt-get install -f --reinstall coreutils init-system-helpers

Po uruchomieniu powyżej możesz zainstalować / uaktualnić / usunąć / wyczyścić jak zwykle dla dowolnych pakietów.

Uddhav Gautam
źródło