dpkg:错误:dpkg 状态数据库已被另一个进程锁定

dpkg:错误:dpkg 状态数据库已被另一个进程锁定

我只是想知道是否有人可以告诉我这是什么意思:

E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
reidsr@ubuntu:~$ sudo dpkg --configure -a
dpkg: error: dpkg status database is locked by another process
reidsr@ubuntu:~$ 

我如何sudo dpkg --configure -a 手动运行?

答案1

第一次运行:

lsof /var/lib/dpkg/lock

然后确保该进程没有运行:

ps cax | grep PID

如果正在运行:

kill PID
#wait
kill -9 PID

确保流程已完成:

ps cax | grep PID

然后删除锁文件:

sudo rm /var/lib/dpkg/lock

让 dpkg 自行修复:

sudo dpkg --configure -a

之后你应该会没事的:)

答案2

在我们的例子中,没有正在运行的进程(PID),因此我硬停止并重新启动了 VPS。

接下来,可能需要删除几个锁文件:

sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/cache/apt/archives/lock

然后您可以dpkg按照建议进行修复:

sudo apt update
sudo dpkg --configure -a

答案3

你也可以尝试:

sudo apt-get install -f

修复任何损坏的软件包:

修复;尝试纠正存在损坏依赖关系的系统。此选项与 install/remove 一起使用时,可以忽略任何软件包,以允许 APT 推断出可能的解决方案。如果指定了软件包,则这些软件包必须完全纠正问题。第一次运行 APT 时,此选项有时是必要的;APT 本身不允许损坏的软件包依赖关系存在于系统中。系统的依赖结构可能已损坏,需要手动干预(这通常意味着使用dselect(1)dpkg --remove消除一些有问题的软件包)。在某些情况下,将此选项与 -m 一起使用可能会产生错误。配置项:APT::Get::Fix-Broken。

答案4

这里有一些很好的答案,但只是想添加一种非 lsof 方法来查找 dpkg 锁定用户

步骤 1:找出谁锁定了 dpkg:

选项 #1:使用 lsof(并非总是安装在机器上)

lsof /var/lib/dpkg/lock

选项 #2:使用 bash

for pid in $(ls /proc | egrep [0-9]+); do sudo ls -l /proc/$pid/fd 2>/dev/null | grep /var/lib/dpkg/lock && echo $pid; done

第 2 步:决定要对当前 dpkg 用户执行什么操作

如果没有这样的流程,就没有什么可决定的,直接跳到下一步。

否则,您必须决定是否要终止该进程或让它正常结束。如果您决定终止它,只需使用kill <pid>。如果该进程仍然不会终止,您可以考虑使用 终止它kill -9 <pid>,但它可能会造成某些不一致,除非您知道自己在做什么,否则我建议不要这样做。

步骤 3:删除锁定文件

sudo rm /var/lib/dpkg/lock

步骤 4:修复 dpkg 内部状态

sudo dpkg --configure -a

相关内容