最近在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
这会显示运行 apt
或 apt-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的进程,但是仍向我显示错误。
注: 我建议尝试上述两种方法或者先重启系统,如果这些都不起作用,那么只有选择删除锁定文件了。
在这种情况下,根本原因是锁定文件,如前面所说,锁定文件用于防止两个或多个进程使用相同数据。当运行 apt
或 apt-get
命令时,他们会在几个地方创建锁定文件。如果之前的 apt
命令没有正确终止,锁定文件不会被删除,因此它们会阻止 apt-get
或 apt
命令的任何新实例。
要解决这种问题,需要做的就是删除锁定文件,但是在这么做之前,最好先停止任何正在使用锁定文件的进程。
使用 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