如何删除/安装未完全安装的软件包?


62

前几天我去安装了bsnes,无论出于什么原因安装都失败了。现在,我无法更新,安装新软件包或执行任何apt-get命令,因为它们都会尝试处理此损坏的软件包并失败。尝试安装新软件包也注定了它的命运。我得到的错误是:

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)

我一直在Google上搜索,也在Ask Ask Ubuntu上搜索,但是找不到有效的解决方案。通常建议的修补程序是运行以下命令:

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

但是,这不起作用。apt-get命令都失败,并出现与上面相同的错误,而dpkg命令只是无济于事。他们经常建议通过Synaptic或命令行清除它的另一件事,这也失败了。

谢谢您的帮助

Answers:


60

对于高级用户,使用风险自负。

根据以下错误信息:

subprocess installed post-installation script returned error exit status 127

您可能想要编辑/var/lib/dpkg/info/[package_name].postinst和注释所有内容(或者更好的方法是,尝试了解它并找出问题),然后重试apt-get

请注意,尽管在此特定问题中,该消息涉及“安装后”,但它可能提到了“删除前”或“删除后”(在这种情况下,要编辑的文件的扩展名应该是.prerm.postrm) 。


2
其实这是最好的方法。重新安装dpkg并不总是有帮助。
Danatela

2
谢谢堆。我必须解决,/var/lib/dpkg/info/[package_name].prerm但您的帖子给了我正确的方向。当然,对于高级用户来说,这是有风险的
sмurf

最好的答案。谢谢!更正.prerm.postrm文件修复了问题。
热熔器

42

除了您已经发布的命令外,还有其他一些命令可能会有所帮助。

  • 自动清除会清除本地本地存储库中检索到的软件包文件。

    sudo apt-get autoclean
    
  • 强制安装/删除软件包。caution小心使用

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

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

与往常一样,您可以dpkg用来安装,删除和清除软件包。

  • 安装

    sudo dpkg -i <pkgname>
    
  • 去掉

    sudo dpkg -r <pkgname>
    
  • 清除

    sudo dpkg -P <pkgname>
    

dpkg和apt-get --force-yes命令都返回与以前相同的错误。Autoclean不会返回错误,但是对于两个损坏的程序包似乎也不起作用。
比贾克2014年

@Bijak您一定一定尝试过清除bsnes
注册用户

是的,使用dpkg -P,apt-get清除和Synaptic
Bijak

发布输出dpkg -l |grep bsnes
注册用户

射频bsnes 0.088-7 amd64精确的SNES / SuperFamicom仿真器
Bijak 2014年

27

因此,经过更多的搜索并真的仔细阅读了错误消息之后,似乎dpkg需要重新安装。

sudo apt-get install --reinstall dpkg

提示这是问题所在(如果有人搜索并看到此问题),那update-alternatives: not found就是错误消息中的内容。重新安装dpkg后,其他软件包将自动继续正常安装。


3
为什么唯一正确的(并且被接受的)答案在列表中的位置如此之低,而少于最高答案的投票数的二分之一呢?+1
David Foerster

原因之一:因为它不适用于无法再下载的软件包“无法重新安装linux-image-extra-4.4.0-65-generic,因此无法下载。”

3
根据问题的标题,这可能是所有来这里的人中不可能的解决方案。但也有很多的原因之一,可以结束了这个问题,所以就会有很多提议“这为我工作”的解决方案。
迈克尔

这实际上是行不通的。
NelsonGon

15

您可以在此/var/lib/dpkg/info/路径中删除软件包文件并更新源。

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

然后,重新安装您的软件包 sudo apt-get install [package_name]

文件


4
实际上,您最好使用sudo rm /var/lib/dpkg/info/[pakege_name].*。否则,您还将删除以相同名称开头的软件包。无论如何,为此,这是唯一对我
有用的

13

如果其他所有方法都失败了。我要做的是首先将目录更改为:

cd /var/lib/dpkg/info

然后我用删除了所有内容.postinst

sudo rm *.postinst

然后更新存储库

sudo apt-get update

然后当我这样做时,一切恢复正常:

sudo apt-get --force-yes install openjdk-7-jre-headless

6
将删除所有安装后脚本,而不仅仅是受影响软件包的脚本。我认为有点太过热情了。-1
David Foerster's

如果很容易识别和删除导致问题的特定安装后脚本,则这可能是删除失败软件包的非常方便的方法。
伊恩·麦金农

在因内核问题重命名受灾内核的.postinst而进行的噩梦之后,修复了该问题
Andy

5

如果所有其他方法均失败,则可以通过手动删除软件包dpkg。跑步sudo dpkg -P bsnes应该清除bsnes


2
dpkg: error processing package libcuda1-340 (--purge): package is in a very bad inconsistent state; you should reinstall it before attempting a removal
endlith 2016年

2

以我 apt-get install -f为例。我正在安装mysql-workbench-community

以前尝试过 apt autoclean

我看到由于某些缺少的依赖项而导致的dpkg错误,可以通过以强制模式安装来纠正(安装依赖项)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.