Como remover / instalar um pacote que não está totalmente instalado?

62

Fui instalar o bsnes no outro dia e por qualquer motivo a instalação falhou. Agora, não consigo atualizar, instalar novos pacotes ou executar basicamente qualquer comando apt-get, pois todos tentam processar esse pacote quebrado e falham. Tentar instalar um novo pacote também o compromete com o mesmo destino. O erro que recebo é:

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)

Eu tenho pesquisado no Google e aqui no Ask Ubuntu, mas não encontrei uma solução que funcione. A correção sugerida geralmente é executar o seguinte:

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

No entanto, isso não funciona. Todos os comandos apt-get falham com o mesmo erro acima e o comando dpkg simplesmente não ajuda. A outra coisa que eles costumam sugerir é removê-lo via Synaptic ou pela linha de comando, que também falha.

Obrigado pela ajuda

Bijak
fonte

Respostas:

60

Para usuários avançados, use por sua conta e risco.

De acordo com a seguinte mensagem de erro:

subprocess installed post-installation script returned error exit status 127

Você pode editar /var/lib/dpkg/info/[package_name].postinste comentar tudo (ou, melhor ainda, tente entendê-lo e identificar o problema) e tente apt-getnovamente.

Observe que, embora nesta pergunta em particular, a mensagem se refira a "pós-instalação", ela poderia ter mencionado, por exemplo, "pré-remoção" ou "pós-remoção" (nesse caso, a extensão do arquivo a ser editado teria sido .prermou .postrm) .

Skippy le Grand Gourou
fonte
2
Na verdade, este é o melhor método. Reinstalar dpkgnem sempre ajuda.
Danatela
2
Obrigado montes. Eu tive que consertar, /var/lib/dpkg/info/[package_name].prermmas sua postagem me deu a direção certa. Definitivamente para usuários avançados, porém, isso é arriscado !
sмurf
A melhor resposta. Obrigado! A correção .prerme os .postrmarquivos corrigem o problema.
Fusor
42

Além dos que você já publicou, existem alguns outros comandos que podem ser úteis.

  • A limpeza automática limpa o repositório local dos arquivos de pacotes recuperados.

    sudo apt-get autoclean
    
  • Forçar a instalação / remoção de pacotes. WithUse com cuidado

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

    e

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

Além disso, como sempre, você pode usar dpkgpara instalar, remover e remover pacotes.

  • Instalar

    sudo dpkg -i <pkgname>
    
  • Retirar

    sudo dpkg -r <pkgname>
    
  • Purga

    sudo dpkg -P <pkgname>
    
Usuário Registrado
fonte
O dpkg e os comandos apt-get --force-yes retornam o mesmo erro que eu estava recebendo antes. O Autoclean não retorna um erro, mas também parece não fazer nada com os dois pacotes quebrados.
Bijak
@Bijak Você certamente deve ter tentado purgar bsnes.
Usuário registrado
Yep, com dpkg -P, apt-get expurgo, e com o Synaptic
Bijak
Publicar a saída dedpkg -l |grep bsnes
Usuário Registrado
bsnes rF ,088-7 AMD64 SNES precisos / SuperFamicom emulador
Bijak
27

Portanto, depois de pesquisar mais e ler com muito cuidado as mensagens de erro novamente, parece que ele dpkgprecisa ser reinstalado.

sudo apt-get install --reinstall dpkg

O que deu a entender que esse era o problema (se alguém pesquisar e ver isso) é que update-alternatives: not foundestava na mensagem de erro. Assim que o dpkg foi reinstalado, os outros pacotes continuaram a instalação normalmente automaticamente.

Bijak
fonte
3
Por que a única resposta correta (e aceita) até agora na lista com menos de ⅓ dos votos da resposta superior? 1
David Foerster
por um lado: como não funciona para pacotes que não podem mais ser baixados "A reinstalação do linux-image-extra-4.4.0-65-generic não é possível, não pode ser baixada."
19417 Joe
3
Esta é provavelmente a solução menos provável para quem vem aqui com base no título da pergunta. Mas há muitas razões pelas quais alguém pode acabar com esse problema; portanto, haverá muitas propostas de soluções "isso funciona para mim".
26617 Michael
Isso realmente não funciona.
NelsonGon 7/09
15

Você pode remover o arquivo do pacote nesse /var/lib/dpkg/info/caminho e atualizar a fonte.

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

Em seguida, reinstale o seu pacote sudo apt-get install [package_name]

Doc

Hamed
fonte
4
Na verdade, você teve melhor uso sudo rm /var/lib/dpkg/info/[pakege_name].*. Caso contrário, você também removerá os pacotes que começam com o mesmo nome. De qualquer forma, obrigado por isso, foi a única solução que funcionou para mim
smac89
13

Se todo o resto falhar. O que fiz foi alterar o diretório para:

cd /var/lib/dpkg/info

então eu removi tudo com .postinst:

sudo rm *.postinst

atualize o repositório

sudo apt-get update

então tudo voltou ao normal quando eu fiz:

sudo apt-get --force-yes install openjdk-7-jre-headless
Mike B
fonte
6
Isso remove todos os scripts de pós-instalação e não apenas o do pacote afetado. Um pouco excessivamente zeloso na minha opinião. -1
David Foerster
Se for fácil identificar e remover apenas o script pós-instalação específico que está causando um problema, pode ser uma maneira muito conveniente de remover um pacote com falha.
11238 Ian Mackinnon
depois de um pesadelo com questões kernal renomeando o .postinst de apenas o kernel afetados corrigiu o problema
Andy
5

Se tudo mais falhar, você poderá remover manualmente o pacote dpkg. A corrida sudo dpkg -P bsnesdeve limpar bsnes.

saiarcot895
fonte
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 14/11
2

No meu caso apt-get install -ffuncionou. Eu estava instalando mysql-workbench-community

Tentado anteriormente apt autoclean

Vi o erro do dpkg devido a algumas dependências ausentes que poderiam ser corrigidas instalando no modo forçado (instalando dependências)

Vikas Avnish
fonte
0
sudo apt-get install -f --reinstall coreutils init-system-helpers

Depois de executar acima, você pode instalar / atualizar / remover / limpar como de costume qualquer pacote.

Uddhav Gautam
fonte