很多次,在从命令行安装/更新软件包时(使用apt-get或者apt)在 Ubuntu 中,我们收到此错误:E: 无法锁定管理目录 (/var/lib/dpkg/)。从初学者的角度来看,这是一个复杂的错误,因为新用户大多不知道“/var/lib/dpkg/”目录以及它与他们当前正在执行的操作有什么关系。
从技术上讲,系统在多种情况下都会抛出错误,人们应该真正关心他/她如何解决这个问题。在本文中,我们将讨论与此错误相关的所有这些方面以及如何安全地摆脱它。
每当遇到此错误时,第一步应该是仔细阅读错误描述。它通常包含一些重要且节省时间的提示。例如,以下屏幕截图显示“apt-get install”命令抛出类似的错误。


但是,如果仔细观察,您会发现两种情况下第一行括号内的文本和第二行逗号后面的文本都不同,这清楚地表明第一种情况下的错误与用户权限有关,而第二种情况下则与锁定文件暂时不可用有关。
如果您遇到与权限相关的错误(如上面第一张图所示),很可能是因为运行“apt-get”或“apt”命令的用户没有足够的权限,并且该命令是在没有权限的情况下运行的sudo。一旦以 root 权限运行命令,错误就会消失。
但是,如果是与锁定相关的错误,则需要进一步调查。
另请阅读: 修复 Ubuntu 中的“用户名不在 sudoers 文件中。此事件将被报告”错误
什么是 /var/lib/dpkg/?
“/var/lib/dpkg/”可以被认为是包管理器“dpkg”的工作目录,而它实际上是“apt-get”(以及“apt”和“aptitude”工具)背后的引擎。每当您使用这些工具安装或删除软件时,它们都会在执行实际操作之前锁定软件包数据库(通过创建“锁定”文件),这实际上是通过获取“/var/lib/dpkg/”目录的锁定来完成的。此步骤有助于避免数据损坏或中断某些其他进程正在执行的正在进行的操作。
假设您已经理解了上述概念,现在让我们讨论调查步骤。
第 1 步:查看是否有其他进程持有锁
现在这看起来应该很合乎逻辑,对吧?要做到这一点,你可以借助老好人的帮助ps命令并将其输出通过管道传输到grep命令,以便您花更少的时间寻找所需的内容。例如,下面的命令可让您查找是否有任何“apt”、“apt-get”或“aptitude”进程正在运行:
ps aux | grep apt第 2 步:等待一段时间,然后采取行动
如果确实有一个命令已经获取了锁,那么理想情况下您应该等待它完成并释放锁。但是,如果该命令花费的时间超过了预期时间,并且您确定它卡在某个地方,您可以继续使用可用的命令来终止它kill或者killall命令(有关它们的更多信息这里)。这应该可以解决您面临的问题。
这里值得一提的是,从不建议直接终止“dpkg”进程 - 它可能会损坏包数据库。我强调这一点是因为现在您知道像“apt”和“apt-get”这样的工具在内部调用“dpkg”,所以如果您在“ps”命令输出中发现“dpkg”进程,您很可能会想到杀死它。
通过运行 apt、apt-get 或 aptitude 命令启动的进程通常更安全。
步骤 3:当“ps”命令输出没有帮助时
请记住,除了 apt 和 apt-get 等命令行工具之外,一些基于 GUI 的应用程序(例如软件中心或更新管理器)也会获取此锁。
笔记:如果您在启动 Ubuntu 后遇到与锁定相关的错误,则很可能您的操作与更新管理器启动的自动轮询重叠。在这种情况下,稍等一下应该可以解决问题。
回到我们讨论的基于 GUI 的应用程序,另一个有用且节省时间的选项是使用fuser命令。
使用“fuser”,您只需要知道正在访问的文件(在我们的例子中为“/var/lib/dpkg/lock”),即使您不知道它是哪个进程,您也可以杀死访问该文件的进程。例如:
sudo fuser -cuk /var/lib/dpkg/lock请记住,fuser命令不会释放您刚刚杀死的进程获取的锁,因此您必须手动执行此操作:
sudo rm -f /var/lib/dpkg/lock笔记: 到 ”释放锁” 只是意味着删除“锁定”文件,以便其他进程可以“获取锁”通过重新创建它。
您可能还需要运行以下两个命令:
sudo fuser -cuk /var/cache/apt/archives/lock; sudo rm -f /var/cache/apt/archives/lock重要提示:永远不要将删除锁定文件作为第一步 - 这应该只是你的最后手段。
结论
一般来说,在继续解决问题之前了解问题背后的原因总是好的。盲目地尝试解决问题的方案永远不会对你有帮助——在某些情况下你可能会成功,但更多时候你会发现自己陷入更大的混乱,特别是如果操作系统是 Linux 的话。
您是否遇到过我们在这里讨论的错误?你是怎么解决的?在评论中留下你的答案。
另请阅读: 如何修复“存储库没有发布文件”错误






