如何修复Ubuntu中的“E: Could not get lock /var/lib/dpkg/lock”错误

最近在ubuntu上试着用apt命令安装应用软件的时候遇到下面的报错:

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/
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?

某些情况下,可能会在使用软件中心时看到这种错误:

在这里插入图片描述
这些报错与ubuntu上的另一个报错Unable to lock directory /var/cache/apt/archives/ 非常类似,关键是修复它们的方式也很类似。

修复 “Unable to lock the administration directory (/var/lib/dpkg/)” 的报错

遇到这种报错实际上是因为其他一些程序正尝试更新 Ubuntu,当命令活应用程序更新系统或安装新软件时,它会锁住 dpkg 文件(Debian 包管理器)。

进行此锁定操作是为了不让两个进程同时修改内容,因为这可能会导致不必要的情况及可能损坏系统。

解决这个 ‘unable to lock administration directory’ 的方法:

方法1:

首先第一件事是检查是否有其他程序进行运行系统更新或安装程序。

如果使用的是命令行,得检查软件中心、软件更新程序、Synaptic 包管理器、Gdebi等应用程序是否正在运行任何更新/安装。如果真是这样的话,需等待程序完成运行过程。

如果没有运行此类运行程序,得检查所有打开的终端窗口,看是否正在运行更新或安装程序,如果是,需等待它完成。

如果以上情况都没有,需检查哪个其他进程正在运行apt 命令(用于处理软件的包管理器),使用命令如下:

ps aux | grep -i apt

对我这种情况,它显示了这个输出:

abhishek@nuc:~$ ps aux | grep -i apt
root      1464  0.0  0.0   4624   772 ?        Ss   19:08   0:00 /bin/sh /usr/lib/apt/apt.systemd.daily update
root      1484  0.0  0.0   4624  1676 ?        S    19:08   0:00 /bin/sh /usr/lib/apt/apt.systemd.daily lock_is_held update
_apt      2836  0.8  0.1  96912  9432 ?        S    19:09   0:03 /usr/lib/apt/methods/http
abhishek  6172  0.0  0.0  21532  1152 pts/1    S+   19:16   0:00 grep --color=auto -i apt

在这里插入图片描述
如果你看到像 apt.systemd.daily update 这样的程序正在使用 apt,那你很幸运,这是一个在后台运行的守护进程,并在你启动系统时自动检查系统更新的。

在 Ubuntu 18.04 及更高版本中,甚至可能会尝试自行下载并安装重要的安全更新,至少这是我在 Ubuntu 桌面上的软件和更新工具的默认设置中看到的。

在这里插入图片描述
如果你在 Ubuntu 服务器上,你可以通过检查文件 /etc/apt/apt.conf.d/20auto-upgrades 的内容来查看是否启用了后台升级。

所以如果你看到apt.systemd.daily 正在使用 apt 进程,你所要做的就是等待几分钟,自动更新完成后,你应该就可以正常安装软件了。

作为永久解决方案,你可以完全禁用自动更新检查和后台升级,但出于安全原因,不建议这么做。

现在,这种简单的场景,可以轻松搞定,但是实际情况往往不会是这样,如果是其他一些程序正在使用 apt ,就需要用不同的方式来处理了。

方法2:

使用 Linux 命令查找并终止正在运行的进程,命令如下:

ps aux | grep -i apt

这会显示运行 aptapt-get 的进程ID。在以下示例中,进程ID为7343,可以忽略包含grep --color=auto 的最后一行。

在这里插入图片描述

可以使用进程ID通过来给进程发送SIGTERM信号来终止它,将 <process_id> 替换为你在上一命令的输出中获得的数字:

sudo kill <process_id>

通过运行ps aux | grep -i apt 命令来检查进程是否被杀死,如果它还在运行的话,用SIGKILL信号强行杀死它:

sudo kill -9 <process_id>

另一种更简单的方法是使用killall命令,这将杀死正在运行的程序的所有实例:

sudo killall apt apt-get

方法3

在大多数情况下,上述方法可以解决问题。但还有其他特殊情况,比如我正在更新我的系统就,不小心关闭了终端,对于这种情况,没有运行的apt的进程,但是仍向我显示错误。

注: 我建议尝试上述两种方法或者先重启系统,如果这些都不起作用,那么只有选择删除锁定文件了。

在这种情况下,根本原因是锁定文件,如前面所说,锁定文件用于防止两个或多个进程使用相同数据。当运行 aptapt-get 命令时,他们会在几个地方创建锁定文件。如果之前的 apt 命令没有正确终止,锁定文件不会被删除,因此它们会阻止 apt-getapt 命令的任何新实例。

要解决这种问题,需要做的就是删除锁定文件,但是在这么做之前,最好先停止任何正在使用锁定文件的进程。

使用 lsof 命令获取持有锁定文件的进程的进程ID,一条一条地运行这些命令:

sudo lsof /var/lib/dpkg/lock
sudo lsof /var/lib/apt/lists/lock
sudo lsof /var/cache/apt/archives/lock

这些命令可能不返回任何东西,或者只返回一个数字,如果他们缺失返回了至少一个数字,那就是用该数字终止进程(将<process_id>替换为您从上述命令中获得地数字):

sudo kill -9 <process_id>

然后可以使用以下命令安全地删除锁定文件:

sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

之后,重新配置包:

sudo dpkg --configure -a

现在,如果运行 sudo apt update 命令,应该不会再有问题了。

故障一:“Unable to acquire the dpkg frontend lock”

如果看到这样的错误:

abhishek@nuc:~$ sudo apt install grub-customizer 
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?

这种应该使用 lsof 命令找出看是哪个进程持有lock-frontend,像前面所描述的那样:

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

展示内容如下:

abhishek@nuc:~$ sudo lsof /var/lib/dpkg/lock-frontend
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
unattende 2823 root    5uW  REG    8,2        0 145221 /var/lib/dpkg/lock-frontend

如果看到“ unattende ” COMMAND 列,这就意味着unattende的安全升级正在运行,应该等待该过程完成,基本上,这就是方法1中讨论的内容。

如果 COMMAND 是其他内容,那就可以终止进程,然后删除锁定文件,可以在PID列下看到进程ID,使用此PID终止进程,之后,删除锁定文件并运行更新命令以查看它是否已修复:

sudo kill -9 PID
sudo rm /var/lib/dpkg/lock-frontend
sudo apt update
那 lsof: warning can’t stat() fuse.gvfsd-fuse 文件系统 是什么?

注意:如果在运行前面提到的 lsof 命令后看到 “lsof: warning can’t stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete” 行,不要惊慌,这不是错误,只是 lsof 也尝试查看已安装的文件系统,并且警告是关于那些已安装的系统。

这些文件被主文件系统上的进程锁定,因此如果它显示一些警告并且没有输出,这仅仅意味着没有进程使用这些锁定文件。

故障二:“dpkg: error: dpkg frontend is locked by another process”

如果在执行方法3中的步骤是看到 “dpkg frontend is locked by another process” 的错误,则需要执行一个额外的步骤。

首先,找出持有锁文件的进程的ID。

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

上面的命令将提供使用锁定文件的进程的详细信息,使用进程 ID 杀死这个程序:

suod kill -9 PID

现在可以解除锁定并重新配置 dpkg:

sudo rm /var/lib/dpkg/lock-frontend
sudo dpkg --configure -a

猜你喜欢

转载自blog.csdn.net/ylfmsn/article/details/128108731