在 Ubuntu 21.10 上,
当尝试apt
使用包postgresql
( Ubuntu 14.4-1.pgdg21.10+1
) 执行任何操作时,进程挂起Setting up postgresql-14 [...]
:
$ sudo apt remove postgresql
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
postgresql
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
2 not fully installed or removed.
After this operation, 71,7 kB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 574023 files and directories currently installed.)
Removing postgresql (14+241.pgdg21.10+1) ...
Setting up postgresql-14 (14.4-1.pgdg21.10+1) ...
同上apt remove
,,...apt reinstall
apt upgrade
我可以不经过这个初始化步骤强制删除吗?
编辑:dpkg
说该包未安装:
$ sudo dpkg -i postgresql
dpkg: error: cannot access archive 'postgresql': No such file or directory
但apt autoremove
仍然挂起:
$ sudo apt autoremove
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up postgresql-14 (14.4-1.pgdg21.10+1) ...
答案1
首先
如果您有一段时间没有更新系统,您首先需要运行:
sudo apt update
安装和删除软件包同样需要最新的软件包数据库。
第二
您遇到的问题:
Removing postgresql (14+241.pgdg21.10+1) ...
进而
Setting up postgresql-14 (14.4-1.pgdg21.10+1) ...
即,当您指定时,系统尝试在尝试删除软件包之后安装它apt remove package-name
...通常,表明软件包处于损坏/不稳定状态...要么它一开始就没有正确安装(丢失/损坏的文件)或者你更改了该软件包的某些已安装文件(名称,权限,路径或内容)...您需要先修复它...修复软件包的最简单方法是像这样重新安装它:
sudo apt install --reinstall package-name
或强制重新配置(谨慎使用--force
)就像这样:
sudo dpkg-reconfigure --force package-name
那么,请阅读以下摘录男人适合:
移除软件包会删除所有打包的数据,但通常会留下一些小的(经过修改的)用户配置文件,以防意外删除。在这种情况下,只需对意外删除的软件包发出安装请求即可恢复其功能。另一方面,您可以通过调用来清除这些残留文件清除 即使是已经删除的软件包。请注意,这不会影响存储在您的主目录中的任何数据或配置。
并决定是否使用:
sudo apt remove package-name
或者:
sudo apt purge package-name
或者 (需谨慎):
sudo dpkg -r --force-remove-reinstreq package-name
要理解这一点,请阅读以下摘录人dpkg:
标记为 reinst-required 的软件包已损坏,需要重新安装。这些软件包无法删除,除非使用选项强制删除强制删除-reinstreq。
或作为最后的手段(必须极其小心):
sudo dpkg -r --force-all package-name
最后
仔细阅读错误消息,并注意确切的包命名……例如postgresql-14
通常是不是和 一样postgresql
。
答案2
有一个脚本叫做/var/lib/dpkg/info/postgresql-14.postinst
:
#!/bin/sh
set -e
VERSION=${DPKG_MAINTSCRIPT_PACKAGE##*-}
if [ "$1" = configure ]; then
. /usr/share/postgresql-common/maintscripts-functions
configure_version $VERSION "$2"
fi
这就是明显的原因。通过注释此脚本的内容,问题消失了,我终于可以解除阻止了apt
。