如何修复“ E:无法在Ubuntu上获得锁/var/lib/dpkg/lock”错误

时间:2020-03-21 11:44:32  来源:igfitidea点击:

每当我启动Ubuntu 18.04 LTS虚拟机并尝试使用APT软件包管理器更新或者安装任何应用程序时,都会出现以下错误:

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

或者,类似以下的错误:

E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?
E: Could not get lock /var/lib/apt/lists/lock – open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/

它每一次都发生。
我不得不等待几分钟才能执行apt操作。

我知道某些进程已在后台安装或者删除软件或者更新系统时锁定了apt数据库。
我运行“ top”命令来调查正在运行的进程的列表。
在查看top命令的输出后,我知道有一个名为无人值守更新的进程,该进程在每次打开Ubuntu虚拟机时都会运行apt update。
在运行apt更新时,apt数据库已锁定,我无法执行任何apt操作。

在Ubuntu上修复"E: Could not get lock /var/lib/dpkg/lock"错误

如果遇到此问题,请等待几分钟,直到当前的安装或者更新或者卸载任务完成。
根据更新的大小,此过程将需要一些时间(5到10分钟或者更长时间)才能完成。
该任务完成后,锁将自动释放。

但是,如果该进程由于某种原因而被卡住,并且将apt数据库锁定了几分钟,那么我们别无选择,只能删除该锁定。
在这种情况下,请按照以下步骤进行修复。

首先,让我们找出拥有锁定文件的进程,例如:/var/lib/dpkg/lock。

$sudo lsof /var/lib/dpkg/lock

如果锁定文件不同,例如/var/lib/dpkg/lock-frontend,则可以使用以下命令找到拥有该锁定文件的进程的PID:

$sudo lsof /var/lib/dpkg/lock-frontend

如果锁定文件是“/var/lib/apt/lists/lock”,请运行:

$sudo lsof /var/lib/apt/lists/lock

输出示例:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
unattende 1548 root 6uW REG 8,2 0 1181062 /var/lib/dpkg/lock

从上面的输出中可以看到,保存锁定文件的进程的PID为1548.

只需使用命令杀死它以释放锁:

$sudo kill -9 1548

现在,我们可以使用以下命令安全地删除锁:

$sudo rm /var/lib/dpkg/lock

或者,

$sudo rm /var/lib/dpkg/lock-frontend

或者,

$sudo rm /var/lib/apt/lists/lock

另外,我们可能需要删除缓存目录中的锁定文件:

$sudo rm /var/cache/apt/archives/lock

解除锁定后,运行:

$sudo dpkg --configure -a