我做到了:
sudo apt-get update
我懂了:
Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock. It is held by process 1131 (packagekitd)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to lock directory /var/lib/apt/lists/
我以前只是删除了锁定文件,但我以前从未见过该注释(它破坏了我的系统吗?)??
我该怎么办?
答案1
最简单的解决方案:仅当您确定没有正在进行的软件安装或更新时,重新启动计算机,锁将被解除。请注意,在运行更新期间重新启动计算机可能会损坏系统。
如果重启无效:请尝试重启packagekit
服务。重启的终端命令packagekit
是:
sudo service packagekit restart
更多细节 -
这意味着dpkg
(或apt
)要么被中断,要么仍在后台运行。
如果您正在更新或安装某些软件,请等到更新或安装完成。正如评论中提到的,使用 packagekitd 表明 GUI 前端确实正在运行更新或检查更新。
删除锁文件手动是不安全,其他答案解释了如何安全地执行此操作。重新启动计算机会自动删除旧的锁定文件,这是解决此问题最简单的方法之一。
答案2
锁文件由 创建process 1131 (packagekitd)
。创建它的目的是使该进程可以对软件包系统进行更改,而不必担心其他程序同时进行其他更改。
如果删除锁定文件,则另一个进程(例如)可以apt-get
同时对 进行更改packagekitd
。由于没有锁定文件,apt-get
也会假定它是唯一进行更改的进程。
结果可能是一个进程所做的某些更改可能会被另一个进程覆盖。最终结果将是两个更改集的随机混合,可能导致系统崩溃。
这是可能的编写程序以便它们可以同时工作而不会互相干扰,但这很困难,而且可能会产生一些非常隐蔽的错误。此软件包系统的作者决定最好只制作一个全局锁定文件。这很简单,也很强大,但对多任务处理者来说不太友好。
现在,所有这些都假设它packagekitd
仍在运行并执行操作。如果此进程实际上已崩溃且未删除锁定文件,则情况会有所不同。
这可能系统处于“半途而废”状态,但软件包系统是旨在检测并恢复。(这更容易)
重启是一种非常严厉的确保packagekitd
不再运行的方法。在启动过程中,旧的锁定文件将被删除,因为它们不再相关。
如果您 100% 确定该进程已崩溃,则可以删除锁定文件而无需重新启动。用于ps
检查进程 1131 是否仍然存在。
如果您确信该进程因某种原因卡住了并且永远不会结束,您可以kill
安全地终止它。如果您认为它可能按预期工作,但只是在不方便的时间,最好等到它完成。如果这不可能,您仍然可以安全地终止它。
答案3
除非您确定锁已过期,否则切勿直接移除它。某些锁与正在运行的进程绑定,并在进程退出时消失。其他类型的锁是手动维护的,如果进程崩溃,它们可能会被遗留(过期)。我相信这个特定的锁属于前一类,因此它不应该过期。如果它被锁定,则有东西在积极地持有它,不应直接移除它。
如果你仔细查看错误,你会看到它是哪个进程,packagekitd,它的 PID 是 1131。你可以运行来查看这个 pid ps u --pid 1131
。软件包程序用于帮助系统更新和在需要时安装软件,因此很可能是罪魁祸首。最好的选择是等待它完成任务,或者如果kill 1131
不耐烦的话尝试轻轻地杀死它。这使用 SIGTERM 信号礼貌地要求它终止,它将有机会进行适当的清理。除非您确实认为它已挂起并崩溃,否则不要尝试使用 -9 或 SIGKILL 杀死它。
答案4
我发现删除“无人值守升级”软件包可以完全停止此频繁出现的错误消息。也就是说,每次启动计算机时我都会手动更新。